Asp.net mvc 3 MVC Razor-创建/编辑视图最佳实践
我第一次使用MVC 3/Razor,所有用于创建和编辑视图的示例和VS框架对于这些概念都有单独的HTML视图,这似乎很奇怪 许多创建/编辑表单之间并没有太大的区别,所以我想知道为什么我找不到使用单个更新表单的人的例子,这些表单可以被创建和编辑操作使用 我得到了一个Update.cshtml视图,但是我想知道它是如何与控制器上的Edit或Create操作方法通信的 我的问题是: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通常相同的情况下,是否有充分
(我在某个地方读到过这篇文章,但找不到,找到后我会更新这篇文章)也看看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对象-验证消息将不起作用。可能存在重复