MVC Razor - создание / редактирование просмотра лучших практик - PullRequest
21 голосов
/ 10 июня 2011

Я работаю с MVC 3 / Razor впервые, и кажется странным, что все примеры и скаффолды VS для создания и редактирования представлений имеют отдельные представления HTML для этих концепций.

На самом деле нет большой разницы между многими формами Create / Edit, поэтому мне было интересно, почему я не могу найти примеры людей, использующих одну форму Update, которая может использоваться как действиями Create, так и Edit.

Я получил рабочее представление Update.cshtml, но мне было интересно, как оно взаимодействует с методом действия Edit или Create на контроллере.

Мои вопросы:

  1. У любого есть быстрый ответ на разговор с контроллером, или
  2. Кто-нибудь знает учебник, демонстрирующий хорошую практику работы таким образом, или
  3. Есть ли веская причина для разделения представлений создания / редактирования, когда HTML часто одинаков.

Приветствия Дэйва

Ответы [ 5 ]

10 голосов
/ 10 июня 2011

Этот (добрый!) Вопрос задается раньше: ASP.NET MVC - используется одна и та же форма для создания и редактирования

По сути, вы можете создать частичное представление и включить его в представление «Создание и редактирование».

У Скотта Гатри есть хороший пост о частичных взглядах .

(я где-то читал об этом, но не могу найти его, я обновлю этот пост, когда найду его)

8 голосов
/ 29 ноября 2013

Помните, что ответы на ваш вопрос также должны определяться бизнес-потребностями (и ролями). Строительные леса предоставляют отдельную функциональность, которая в некоторых случаях является предпочтительной реализацией.

Функциональность CREATE и EDIT часто в значительной степени идентична с технической (программной) точки зрения. Это может привести технического специалиста к мысли, что функциональность должна быть объединена для реализации более эффективного технического решения. Однако любая техническая реализация должна отвечать потребностям бизнеса, что может потребовать разделения (например, по роли бизнеса) этих проблем.

Например, бизнес может требовать, чтобы роль, которая СОЗДАЕТ бизнес-объекты, не была той же, что и РЕДАКТИРУЕТ их. В этом случае внедренные веб-страницы могут вообще не рассматриваться одними и теми же ролями (и людьми).

Если вы реализуете CREATE и EDIT, используя общие функциональные возможности, но бизнес-необходимость заключается в разделении ролей, вы все равно должны реализовать «проверку ролей» перед отображением требуемого представления / частичного представления / и т.д. В таких случаях предпочтительными могут быть отдельные представления.

3 голосов
/ 10 августа 2012

Я делаю это. Я не знаю, является ли это лучшей практикой, но это может быть приятно. В некоторых ситуациях может быть полезен совершенно отдельный вид добавления / редактирования. Кроме того, если вы используете ViewModel, то, насколько я могу судить, вы застряли, используя одну и ту же 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>

Я немного их отредактировал, чтобы чего-то не хватало, но это должно дать вам общее представление.

0 голосов
/ 24 июня 2013

вот как я это делаю, это не всегда лучшая практика (это зависит от ситуации)

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 действия.

0 голосов
/ 12 декабря 2011

Посмотрите на леса MVC в nuget. Когда он генерирует файлы представлений, он явно создает частичку creatandedit и использует эту частичку для создания и редактирования страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...