Asp.net mvc,具有多个可更新部分的视图 - 如何?

发布于 2024-08-29 19:21:55 字数 3099 浏览 5 评论 0原文

我已经开始做 ASP.NET MVC 编程并且每天都更喜欢它。

我见过的大多数示例都使用单独的视图来查看和编辑特定实体的详细信息。

例如 - 链接到单独的“详细信息”和“更新”视图的音乐专辑表

[操作] |标题 |艺术家

详细信息,更新 |呃宝贝|巴里怀特

详细信息,更新|莫乔先生 | Barry White

使用 mvc,我如何实现一种设计,其中 R 和 U (CRUD) 在单个视图中表示,而且用户可以编辑视图的单独部分,从而限制用户的数据量可以在保存前进行编辑吗?

示例模型 - 编辑相册详细信息:

我已经通过ajax调用实现了这样的设计,但我很好奇如何在没有ajax的情况下做到这一点。 我自己对此的部分看法如下所示。我使用一个标志(枚举 EditCode) 指示视图的哪一部分(如果有)必须呈现表单。 这样的设计符合框架吗,能不能做得更优雅一点?

AlbumController

public class AlbumController : Controller
{
    public ActionResult Index()
    {
        var albumDetails = from ManageVM in state.AlbumState.ToList()
                           select ManageVM.Value.Detail;
        return View(albumDetails);
    }

    public ActionResult Manage(int albumId, EditCode editCode)
    {
        (state.AlbumState[albumId] as ManageVM).EditCode = (EditCode)editCode;
        ViewData["albumId"] = albumId;
        return View(state.AlbumState[albumId]);
    }

    [HttpGet]
    public ActionResult Edit(int albumId, EditCode editCode)
    {
       return RedirectToAction("Manage", new { albumId = albumId, editCode = editCode });
    }

    // edit album details
    [HttpPost]
    public ActionResult EditDetail(int albumId, Detail details)
    {
        (state.AlbumState[albumId] as ManageVM).Detail = details;
        return RedirectToAction("Manage", new { albumId = albumId, editCode = EditCode.NoEdit });// zero being standard 
    }

    // edit album thought
    [HttpPost]
    public ActionResult EditThoughts(int albumId, List<Thought> thoughts)
    {
        (state.AlbumState[albumId] as ManageVM).Thoughts = thoughts;
        return RedirectToAction("Manage", new { albumId = albumId, editCode = EditCode.NoEdit });// zero being standard 
    }

Flag - EditCode

public enum EditCode
{
       NoEdit,
       Details,
 Genres,
       Thoughts
}

Mangae view

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Controllers.ManageVM>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Manage
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Manage</h2>
    <% if(Model.EditCode == MvcApplication1.Controllers.EditCode.Details) 
       {%>
        <% Html.RenderPartial("_EditDetails", Model.Detail); %>    
    <% }else{%>
        <% Html.RenderPartial("_ShowDetails", Model.Detail); %>    
    <% } %>
    <hr />
    <% if(Model.EditCode == MvcApplication1.Controllers.EditCode.Thoughts) 
       {%>
        <% Html.RenderPartial("_EditThoughts", Model.Thoughts); %>    
    <% }else{%>
        <% Html.RenderPartial("_ShowThoughts", Model.Thoughts); %>    
    <% } %>

I have started doing asp.net mvc programming and like it more everyday.

Most of the examples I have seen use separate views for viewing and editing details of a specific entity.

E.g. - table of music albums linking to separate 'detail' and 'update' views

[Action] | Title | Artist

detail, update | Uuuh Baby | Barry White

detail, update | Mr Mojo | Barry White

With mvc how can I achieve a design where the R and the U (CRUD) are represented in a single view, and furthermore where the user can edit separate parts of the view, thus limiting the amount of data the user can edit before saving?

Example mockup - editing album detials:

I have achieved such a design with ajax calls, but Im curious how to do this without ajax.
Parts of my own take on this can be seen below. I use a flag (enum EditCode)
indicating which part of the view, if any, that has to render a form. Is such a design in accordance with the framework, could it be done more elegantly?

AlbumController

public class AlbumController : Controller
{
    public ActionResult Index()
    {
        var albumDetails = from ManageVM in state.AlbumState.ToList()
                           select ManageVM.Value.Detail;
        return View(albumDetails);
    }

    public ActionResult Manage(int albumId, EditCode editCode)
    {
        (state.AlbumState[albumId] as ManageVM).EditCode = (EditCode)editCode;
        ViewData["albumId"] = albumId;
        return View(state.AlbumState[albumId]);
    }

    [HttpGet]
    public ActionResult Edit(int albumId, EditCode editCode)
    {
       return RedirectToAction("Manage", new { albumId = albumId, editCode = editCode });
    }

    // edit album details
    [HttpPost]
    public ActionResult EditDetail(int albumId, Detail details)
    {
        (state.AlbumState[albumId] as ManageVM).Detail = details;
        return RedirectToAction("Manage", new { albumId = albumId, editCode = EditCode.NoEdit });// zero being standard 
    }

    // edit album thought
    [HttpPost]
    public ActionResult EditThoughts(int albumId, List<Thought> thoughts)
    {
        (state.AlbumState[albumId] as ManageVM).Thoughts = thoughts;
        return RedirectToAction("Manage", new { albumId = albumId, editCode = EditCode.NoEdit });// zero being standard 
    }

Flag - EditCode

public enum EditCode
{
       NoEdit,
       Details,
 Genres,
       Thoughts
}

Mangae view

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Controllers.ManageVM>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Manage
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Manage</h2>
    <% if(Model.EditCode == MvcApplication1.Controllers.EditCode.Details) 
       {%>
        <% Html.RenderPartial("_EditDetails", Model.Detail); %>    
    <% }else{%>
        <% Html.RenderPartial("_ShowDetails", Model.Detail); %>    
    <% } %>
    <hr />
    <% if(Model.EditCode == MvcApplication1.Controllers.EditCode.Thoughts) 
       {%>
        <% Html.RenderPartial("_EditThoughts", Model.Thoughts); %>    
    <% }else{%>
        <% Html.RenderPartial("_ShowThoughts", Model.Thoughts); %>    
    <% } %>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

土豪我们做朋友吧 2024-09-05 19:21:56

最后一部分让我感觉很混乱。我建议用 Html Helpers 包装它们来清理你的视图。

<h2>Manage</h2>
<% Html.RenderDetailsPartial(Model.EditCode) %>
<hr />
<% Html.RenderThoughtsPartial(Model.EditCode) %>

让 HTMLHelper 根据 EditCode 确定使用哪个视图。

The last part feels messy to me. I would recommend wrapping those with Html Helpers to clean up your view.

<h2>Manage</h2>
<% Html.RenderDetailsPartial(Model.EditCode) %>
<hr />
<% Html.RenderThoughtsPartial(Model.EditCode) %>

Let the HTMLHelper determine which view to use based on the EditCode.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文