ASP.NET MVC局部视图和表单动作名称

Dmi*_*kiy 4 asp.net-mvc

如何创建具有指定ID的表单的部分视图?我得到了:

using (Html.BeginForm(?action?,"Candidate",FormMethod.Post,new {id="blah"}))
Run Code Online (Sandbox Code Playgroud)

部分视图用于创建和编辑,因此第一个参数?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" }))   
Run Code Online (Sandbox Code Playgroud)

有点丑,但它有效.有没有更好的方法在局部视图中获取操作名称?

tva*_*son 7

传递要通过ViewData执行的操作.

在渲染视图的操作中,为回发操作创建一个ViewData项.在表单中引用此ViewData项以填充action参数.或者,您可以创建一个仅包含视图的模型,其中包含操作和实际模型作为属性,并从那里引用它.

使用ViewData的示例:

using (Html.BeginForm( (string)ViewData["PostBackAction"], "Candidate", ... 
Run Code Online (Sandbox Code Playgroud)

渲染动作:

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


public ActionResult Edit( int id )
{
     ViewData["PostBackAction'] = "Update";
     ...
}
Run Code Online (Sandbox Code Playgroud)

使用模型的示例

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

using (Html.BeginForm( Model.Action, "Candidate", ...
Run Code Online (Sandbox Code Playgroud)

渲染动作:

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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据你的评论,如果你觉得这应该在视图中完成(虽然我不同意),你可以尝试一些基于ViewContext.RouteData的逻辑

<%
    var action = "Create";
    if (this.ViewContext.RouteData.Values["action"] == "Edit")
    {
        action = "Update";
    }
    using (Html.BeginForm( action, "Candidate", ... 
    {
 %>
Run Code Online (Sandbox Code Playgroud)