Частичное представление ASP.NET MVC и имя действия формы - PullRequest
4 голосов
/ 08 апреля 2009

Как мне создать частичное представление, которое имеет форму с назначенным идентификатором? Я добрался до:

using (Html.BeginForm(?action?,"Candidate",FormMethod.Post,new {id="blah"}))

Частичное представление используется как для создания, так и для редактирования, поэтому первый параметр ?action? будет другим. Я не могу понять, какое значение ?action? должно быть.


ОБНОВЛЕНИЕ:

Полагаю, я не совсем понял вопрос. В итоге я разделил Request.RawUrl, чтобы получить имя контроллера и имя действия:

 string[] actionUrlParts = ViewContext.HttpContext.Request.RawUrl.Split('/');
 using (Html.BeginForm(actionUrlParts.Length >= 2? actionUrlParts[2] : "",
        actionUrlParts.Length >= 1 ? actionUrlParts[1] : "", FormMethod.Post, new { id = "blah" }))   

Довольно уродливо, но это работает. Есть ли лучший способ получить имя действия в частичном представлении?

Ответы [ 3 ]

7 голосов
/ 09 апреля 2009

Передайте действие, которое будет выполнено через ViewData.

В вашем действии, которое отображает представление, создайте элемент ViewData для действия обратной передачи. В вашей форме укажите этот элемент ViewData для заполнения параметра действия. Кроме того, вы можете создать модель только для просмотра, которая включает в себя свойства и фактическую модель в качестве свойств, и ссылаться на нее оттуда.

Пример использования ViewData:

using (Html.BeginForm( (string)ViewData["PostBackAction"], "Candidate", ... 

Рендеринг действий:

public ActionResult Create()
{
     ViewData["PostBackAction"] = "New";
     ...
}


public ActionResult Edit( int id )
{
     ViewData["PostBackAction'] = "Update";
     ...
}

Пример использования модели

public class UpdateModel
{
     public string Action {get; set;}
     public Candidate CandidateModel { get; set; }
}

using (Html.BeginForm( Model.Action, "Candidate", ...

Рендеринг действий:

public ActionResult Create()
{
     var model = new UpdateModel { Action = "New" };

     ...

     return View(model);
}


public ActionResult Edit( int id )
{
     var model = new UpdateModel { Action = "Update" };

     model.CandidateModel = ...find corresponding model from id...

     return View(model);
}

РЕДАКТИРОВАТЬ : На основании вашего комментария, если вы считаете, что это должно быть сделано в представлении (хотя я не согласен), вы можете попробовать некоторую логику на основе ViewContext.RouteData

<%
    var action = "Create";
    if (this.ViewContext.RouteData.Values["action"] == "Edit")
    {
        action = "Update";
    }
    using (Html.BeginForm( action, "Candidate", ... 
    {
 %>
1 голос
/ 21 марта 2010

Передача нулей как действий и контроллеров. Расширение будет использовать только текущее действие и текущий контроллер

using (Html.BeginForm(null, null, FormMethod.Post, new { id="Model" }))

Действие, сгенерированное для формы, будет таким же, как родительское представление этого частичного представления.

Генерирует

<form action="/Orders/Edit/1" id="Model" method="post">

для URL http://localhost:1214/Orders/Edit/1

... и это

<form action="/Orders/Create" id="Model" method="post">

для URL http://localhost:1214/Orders/Create

0 голосов
/ 09 апреля 2009
<% html.RenderPartial("MyUserControl", Model.ID) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...