Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC Razor-创建/编辑视图最佳实践_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc 3 MVC Razor-创建/编辑视图最佳实践

Asp.net mvc 3 MVC Razor-创建/编辑视图最佳实践,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,我第一次使用MVC 3/Razor,所有用于创建和编辑视图的示例和VS框架对于这些概念都有单独的HTML视图,这似乎很奇怪 许多创建/编辑表单之间并没有太大的区别,所以我想知道为什么我找不到使用单个更新表单的人的例子,这些表单可以被创建和编辑操作使用 我得到了一个Update.cshtml视图,但是我想知道它是如何与控制器上的Edit或Create操作方法通信的 我的问题是: 任何人都可以快速回答控制器的问题,或者 任何人都知道这样工作的良好实践教程,或者 在HTML通常相同的情况下,是否有充分

我第一次使用MVC 3/Razor,所有用于创建和编辑视图的示例和VS框架对于这些概念都有单独的HTML视图,这似乎很奇怪

许多创建/编辑表单之间并没有太大的区别,所以我想知道为什么我找不到使用单个更新表单的人的例子,这些表单可以被创建和编辑操作使用

我得到了一个Update.cshtml视图,但是我想知道它是如何与控制器上的Edit或Create操作方法通信的

我的问题是:

  • 任何人都可以快速回答控制器的问题,或者
  • 任何人都知道这样工作的良好实践教程,或者
  • 在HTML通常相同的情况下,是否有充分的理由将创建/编辑视图分开
  • 干杯,戴夫这类问题以前被问过:

    基本上,您可以创建局部视图,并将其包含在“创建和编辑”视图中

    斯科特·古思里(Scott Guthrie)有一篇关于这方面的好文章


    (我在某个地方读到过这篇文章,但找不到,找到后我会更新这篇文章)

    也看看nuget中的MVC scaffolding,当它生成视图文件时,它会显式地创建creatandedit部分,并让创建页面和编辑页面使用该部分。

    我这样做。我不知道这是否是最好的做法,但它可以很好。但是,在某些情况下,完全独立的添加/编辑视图可能很有用。此外,如果您使用的是ViewModels,那么据我所知,您在添加和编辑时都无法使用相同的ViewModel。理论上,他们都应该有自己的视图模型

    以下是我对它的看法:

    AddVideo.cshtml

    @model Multimedia.MediaVideoViewModel
    
    @{
        Layout = "~/Views/Shared/LiveSubLayout.cshtml";
    }
    
    @section AdditionalHeadContent {
    
    }
    
    <div class="page-header">
        <h1>Add a new video</h1>
    </div>
    
    <div id="add-video" class="row-fluid">
        @Html.Partial("_VideoForm", Model, new ViewDataDictionary { { "ActionKeyword", "Add" } })
    </div>
    
    @model Multimedia.MediaVideoViewModel
    
    @{
        Layout = "~/Views/Shared/LiveSubLayout.cshtml";
    }
    
    @section AdditionalHeadContent {
    
    }
    
    @if (ViewBag.Success)
    {
        <div class="alert alert-success">
        <button class="close" data-dismiss="alert">×</button>
            <h3><strong>Video saved!</strong></h3><br/>
            <div class="btn-group">
              <a href="#" class="btn">Preview this video</a>
              @Html.ActionLink("Add Another Video", "AddVideo", "Multimedia", new { Model.Id }, new { @class = "btn" })
              @Html.ActionLink("View all media", "Index", "Multimedia", null, new { @class = "btn" })
            </div>
            <p>or continue editing below...</p>
        </div>
    }
    
    <div class="page-header">
        <h1>Edit video <small>@Model.Title</small></h1>
    </div>
    
    <div id="edit-video" class="row-fluid">
        @Html.Partial("_VideoForm", Model, new ViewDataDictionary { { "ActionKeyword", "Edit" } })
    </div>
    
    @model Multimedia.MediaVideoViewModel
    
    @{
        string actionKeyword = ViewData["ActionKeyword"].ToString();
    }
    
    <div class="span6">
    
        @using (Html.BeginForm("editvideo", "multimedia"))
        {
            <label class="control-label" id="embed-url">Paste video URL here:</label>
            <div class="control-group">
                @Html.TextBoxFor(model => model.EmbedUrl, new { @class = "span12", id = "video-url", placeholder = "ex: http://www.youtube.com/watch?v=PoAGasPLh30" })
                <button class="btn disabled" id="get-video" title="Tooltip">Get Video</button>
            </div>
    
            <div class="video-meta">
    
                <h3>Video Information</h3>
                <label class="control-label">Title:</label>
    
                <div class="control-group">
                    @Html.TextBoxFor(model => model.Title, new { @class = "span12", id = "video-title" })
                    @Html.ValidationMessageFor(model => model.Title, "A title is required", new { @class = "label label-important" })
                </div>
    
                <label class="control-label">Description:</label>
                <div class="control-group">
                    @Html.TextAreaFor(model => model.Description, new { @class = "span12", id = "video-description" })
                </div>
    
                <h3>Categories</h3>
    
                <div id="tag-search" class="well">
                        <label class="control-label">Search tags:</label>
                        <div class="controls"><input type="text" class="typeahead" /></div>
                        @if (Model != null)
                        {
                            foreach (var category in Model.Tags)
                            {
                                @Html.Partial("_TagFragment", category)
                            }
                        }
                </div>
    
                <hr />
    
                @Html.HiddenFor(model => model.Id)
                @Html.HiddenFor(model => model.ThumbnailUrl, new { id = "thumb-url" })
                <input type="submit" id="video-submit" name="video-submit" class="btn-large btn-primary" value="@actionKeyword video" />
            </div>
        }
    
    </div>
    
    @model Multimedia.mediaveoviewmodel
    @{
    Layout=“~/Views/Shared/LiveSubLayout.cshtml”;
    }
    @第节附加内容{
    }
    添加新视频
    @Html.Partial(“\u VideoForm”,Model,newviewDataDictionary{{{“ActionKeyword”,“Add”}})
    
    EditVideo.cshtml

    @model Multimedia.MediaVideoViewModel
    
    @{
        Layout = "~/Views/Shared/LiveSubLayout.cshtml";
    }
    
    @section AdditionalHeadContent {
    
    }
    
    <div class="page-header">
        <h1>Add a new video</h1>
    </div>
    
    <div id="add-video" class="row-fluid">
        @Html.Partial("_VideoForm", Model, new ViewDataDictionary { { "ActionKeyword", "Add" } })
    </div>
    
    @model Multimedia.MediaVideoViewModel
    
    @{
        Layout = "~/Views/Shared/LiveSubLayout.cshtml";
    }
    
    @section AdditionalHeadContent {
    
    }
    
    @if (ViewBag.Success)
    {
        <div class="alert alert-success">
        <button class="close" data-dismiss="alert">×</button>
            <h3><strong>Video saved!</strong></h3><br/>
            <div class="btn-group">
              <a href="#" class="btn">Preview this video</a>
              @Html.ActionLink("Add Another Video", "AddVideo", "Multimedia", new { Model.Id }, new { @class = "btn" })
              @Html.ActionLink("View all media", "Index", "Multimedia", null, new { @class = "btn" })
            </div>
            <p>or continue editing below...</p>
        </div>
    }
    
    <div class="page-header">
        <h1>Edit video <small>@Model.Title</small></h1>
    </div>
    
    <div id="edit-video" class="row-fluid">
        @Html.Partial("_VideoForm", Model, new ViewDataDictionary { { "ActionKeyword", "Edit" } })
    </div>
    
    @model Multimedia.MediaVideoViewModel
    
    @{
        string actionKeyword = ViewData["ActionKeyword"].ToString();
    }
    
    <div class="span6">
    
        @using (Html.BeginForm("editvideo", "multimedia"))
        {
            <label class="control-label" id="embed-url">Paste video URL here:</label>
            <div class="control-group">
                @Html.TextBoxFor(model => model.EmbedUrl, new { @class = "span12", id = "video-url", placeholder = "ex: http://www.youtube.com/watch?v=PoAGasPLh30" })
                <button class="btn disabled" id="get-video" title="Tooltip">Get Video</button>
            </div>
    
            <div class="video-meta">
    
                <h3>Video Information</h3>
                <label class="control-label">Title:</label>
    
                <div class="control-group">
                    @Html.TextBoxFor(model => model.Title, new { @class = "span12", id = "video-title" })
                    @Html.ValidationMessageFor(model => model.Title, "A title is required", new { @class = "label label-important" })
                </div>
    
                <label class="control-label">Description:</label>
                <div class="control-group">
                    @Html.TextAreaFor(model => model.Description, new { @class = "span12", id = "video-description" })
                </div>
    
                <h3>Categories</h3>
    
                <div id="tag-search" class="well">
                        <label class="control-label">Search tags:</label>
                        <div class="controls"><input type="text" class="typeahead" /></div>
                        @if (Model != null)
                        {
                            foreach (var category in Model.Tags)
                            {
                                @Html.Partial("_TagFragment", category)
                            }
                        }
                </div>
    
                <hr />
    
                @Html.HiddenFor(model => model.Id)
                @Html.HiddenFor(model => model.ThumbnailUrl, new { id = "thumb-url" })
                <input type="submit" id="video-submit" name="video-submit" class="btn-large btn-primary" value="@actionKeyword video" />
            </div>
        }
    
    </div>
    
    @model Multimedia.mediaveoviewmodel
    @{
    Layout=“~/Views/Shared/LiveSubLayout.cshtml”;
    }
    @第节附加内容{
    }
    @if(ViewBag.Success)
    {
    ×
    视频已保存!
    @ActionLink(“添加另一个视频”,“添加视频”,“多媒体”,新{Model.Id},新{@class=“btn”}) @ActionLink(“查看所有媒体”,“索引”,“多媒体”,空,新{@class=“btn”}) 或者继续在下面编辑

    } 编辑视频@Model.Title @Html.Partial(“\u VideoForm”,Model,newviewDataDictionary{{{“ActionKeyword”,“Edit”})
    \u VideoForm.cshtml(部分)

    @model Multimedia.mediaveoviewmodel
    @{
    字符串actionKeyword=ViewData[“actionKeyword”]。ToString();
    }
    @使用(Html.BeginForm(“编辑视频”、“多媒体”))
    {
    将视频URL粘贴到此处:
    @Html.TextBoxFor(model=>model.EmbedUrl,新的{@class=“span12”,id=“视频url”,placeholder=“ex:http://www.youtube.com/watch?v=PoAGasPLh30" })
    获取视频
    视频信息
    标题:
    @Html.TextBoxFor(model=>model.Title,新的{@class=“span12”,id=“video Title”})
    @Html.ValidationMessageFor(model=>model.Title,“需要一个标题”,新的{@class=“label-label-important”})
    说明:
    @Html.TextAreaFor(model=>model.Description,新的{@class=“span12”,id=“video Description”})
    类别
    搜索标签:
    @如果(型号!=null)
    {
    foreach(Model.Tags中的var类别)
    {
    @Html.Partial(“_TagFragment”,类别)
    }
    }
    
    @Html.HiddenFor(model=>model.Id) @Html.HiddenFor(model=>model.ThumbnailUrl,新的{id=“thumburl”}) }

    我对这些内容进行了一点编辑,这样可能会遗漏一些内容,但这应该能让您大致了解情况。

    以下是我的做法,这并不总是最佳做法(取决于具体情况)

    1/组合控制器操作以创建和编辑

    public PartialViewResult Creedit(string id = null)
    {
        if (id == null)
        {
            // Create new record (this is the view in Create mode)
            return PartialView();
        }
        else
        {
            // Edit record (view in Edit mode)
            Client x = db.ClientSet.Find(id);
            if (x == null) { return PartialView("_error"); }
            // ...
            return PartialView(x);
        }
    }
    
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Creedit(Client x)
    {
        if (x.id == null)
        {
            // insert new record
        }
        else
        {
            // update record
        }
    }
    
    2/将“编辑”和“创建”视图合并到一个名为Creedit的视图中

    // if you need to display something unique to a create view
    // just check if the Model is null
    @if(Model==null){
    }
    

    因此,我有1个视图和2个操作(1个post和1个get),而不是2个视图和4个操作。

    请注意,对您的问题的回答也应该由业务需求(和角色)决定。脚手架确实提供了单独的功能,在某些情况下,这是首选的实现

    从技术(编程)的角度来看,创建和编辑功能通常非常相同。这可能会导致技术人员认为,为了实现更高效的技术解决方案,应该将功能结合起来。但是,任何技术实现都必须响应业务需求,这可能需要将这些关注点分离(例如,按业务角色)

    例如,业务可能要求创建业务对象的角色与编辑业务对象的角色不同。在这种情况下,实现的web页面可能根本不会被相同的角色(和人员)看到


    如果您使用通用功能实现创建和编辑,但业务需要角色分离,则在呈现所需视图/局部视图/等之前,您仍必须执行“角色检查”。在这种情况下,分离视图可能是首选实现。

    Scott Guthrie博客文章是关于布局的,不是片面的观点。我不认为这是重复的问题;TS正在处理MVC 3Don,无法在AddVideo和EditVideo视图中创建新的ViewDataDictionary对象-验证消息将不起作用。可能存在重复