Подтвердить что ты не робот

MVC Razor - создание/редактирование лучшей практики

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

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

У меня появилось представление Update.cshtml, но было интересно, как он говорит о методе Edit или Create на контроллере.

Мои вопросы:

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

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

4b9b3361

Ответ 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 и имеющий страницу создания и страницы редактирования, которые являются частичными.