MVC Razor - создание/редактирование лучшей практики
Я работаю с MVC 3/Razor в первый раз, и кажется странным, что все примеры и VS-леса для создания и редактирования представлений имеют отдельные представления HTML для этих понятий.
Между многими формами Create/Edit действительно не так много различий, поэтому мне было интересно, почему я не могу найти примеры людей, использующих одну форму обновления, которая может использоваться как для действий Create, так и для редактирования.
У меня появилось представление Update.cshtml, но было интересно, как он говорит о методе Edit или Create на контроллере.
Мои вопросы:
- У любого есть быстрый ответ на разговор с контроллером или
- Кто-нибудь знает учебник, показывающий хорошую практику для этого, или
- Есть ли какая-то веская причина для сохранения разметки "Создать/Редактировать", когда HTML-код часто совпадает.
Приветствия Дейва
Ответы
Ответ 1
Этот вопрос (типа!) задается раньше: ASP.NET MVC - используя ту же форму для создания и редактирования
В принципе, вы можете создать частичный вид и включить его в свое представление Create and Edit.
Скотт Гатри имеет хороший пост о Частичные виды.
(Я читал об этом где-то, но не могу его найти, я обновлю это сообщение, когда найду его)
Ответ 2
Помните, что ответы на ваш вопрос также должны определяться потребностями бизнеса (и ролями). Леса обеспечивают отдельную функциональность, которая в некоторых случаях является предпочтительной реализацией.
Функции CREATE и EDIT часто в значительной степени идентичны с точки зрения технического (программирования). Это может привести к тому, что технический человек подумает, что функциональность должна сочетаться для реализации более эффективного технического решения. Однако любая техническая реализация должна отвечать потребностям бизнеса, что может потребовать разделения (например, бизнес-роли) этих проблем.
Например, бизнес может требовать, чтобы роль бизнес-объектов CREATEs не была такой же, как EDIT. В этом случае реализованные веб-страницы могут не отображаться одинаковыми ролями (и людьми) вообще.
Если вы реализуете CREATE и EDIT с использованием общей функциональности, но бизнес-необходимость заключается в разделении ролей, вы должны по-прежнему выполнять "проверку роли" перед рендерингом требуемого вида/частичного представления /etc. В таких случаях отдельные представления могут быть предпочтительной реализацией.
Ответ 3
Я делаю это. Я не знаю, лучше ли это, но это может быть приятно. Есть некоторые ситуации, в которых может быть полезно совершенно отдельное представление добавления/редактирования. Кроме того, если вы используете ViewModels, то насколько я могу судить, вы застряли, используя один и тот же ViewModel для добавления и редактирования. Теоретически они должны иметь свои собственные ViewModels.
Вот как это выглядит для меня:
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>
EditVideo.cshtml
@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>
_VideoForm.cshtml(частично)
@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>
Я отредактировал это немного, чтобы что-то могло отсутствовать, но это должно дать вам общую идею.
Ответ 4
вот как я это делаю, это не всегда лучшая практика (это зависит от случая)
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 сообщение и 1 получение) вместо 2 просмотров и 4 действия.
Ответ 5
Посмотрите на строительные леса MVC в nuget, а когда он генерирует файлы представления, он делает это явно, создавая частичный файл creatandedit и имеющий страницу создания и страницы редактирования, которые являются частичными.