3

我有一个带有以下 url 的表单: CreateEntity?officeCodeId=5

当我发送表单进行验证时,如果验证失败,它只返回 CreateEntity url。没有 officeCodeId=5。

如果用户在 URL 或 F5 上单击输入 - 我的网站失败 - 它需要缺少 officecodeId 参数。我可以将它保存到会话或其他存储中。但我想在 URL 中有它

我的观点:

[HttpGet]
        public virtual ActionResult CreateEntity(int? officeCodeId)
        {            
            var model = new CreateViewModel();
            FillViewModel(model, officeCodeId);
            return View("Create", model);
        }


[HttpPost]
protected virtual ActionResult CreateEntity(TEditViewModel model)
        {
            if (ModelState.IsValid)
            {
              //Do some model stuff if 
            }

            return View("Create", model);
        }

编辑。我的观点:

using (Html.BeginForm("CreateEntity", "Employee", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.HiddenFor(x => x.OfficeCodeId)  
<div>
                @Html.LabelFor(model => model.FirstName, CommonRes.FirstNameCol)
                @Html.TextBoxFor(model => model.FirstName, Model.FirstName)
                @Html.ValidationMessageFor(model => model.FirstName)
            </div>
            <div>
                @Html.LabelFor(model => model.LastName, CommonRes.LastNameCol)
                @Html.TextBoxFor(model => model.LastName, Model.LastName)
                @Html.ValidationMessageFor(model => model.LastName)
            </div>
<div> <div class="input-file-area"></div>
                    <input id="Agreements" type="file" name="Agreements"/>
</div>   

}

编辑 2. 添加:

@using (Html.BeginForm("CreateEntity", "Employee", FormMethod.Post, new { officeCodeId = Model.OfficeCodeId, enctype = "multipart/form-data" }))

没有帮助。它产生以下形式:

<form action="/PhoneEmployee/CreateEntity" enctype="multipart/form-data" method="post" officecodeid="5">

解决方案是

<form action="@Url.Action("CreateEntity", "Employee")?officecodeid=@Model.OfficeCodeId" enctype="multipart/form-data" method="post">
4

3 回答 3

2

问题是您的HttpPost操作没有任何id参数的概念。如果您想支持类似的 URL,则使操作签名支持该参数,例如

[HttpGet]
public ActionResult CreateEntity(int? officeCodeId)

[HttpPost]
public ActionResult CreateEntity(int officeCodeId, EditViewModel model);
于 2013-11-05T12:51:25.410 回答
1

您的操作应如下所示:

行动:

[HttpGet]
public virtual ActionResult CreateEntity(int? officeCodeId)
{            
    var model = new CreateViewModel();
    FillViewModel(model, officeCodeId);
    return View("Create", model);
}

[HttpPost]
public virtual ActionResult CreateEntity(ViewModel model)
{            
    if (model.IsValid) {
       // save...
       return RedirectToAction("EditEntity", newId!!!);
    } 

    return View("Create", model);
}

html:

 @using (Html.BeginForm()) {
     @Html.HiddenFieldFor(m => Model.officeCodeId)
     ...
 } 

您的 officeId 应该在 model 中。在 html 表单上,您可以将其存储在隐藏字段中。

于 2013-11-05T12:46:52.747 回答
0

您的最终答案非常好并且效果很好,尽管您可以通过简单地包括以下内容来进一步增强它以使其更通用Request.QueryString

<form action="@Url.Action("CreateEntity", "Employee")?@(Request.QueryString)"
  enctype="multipart/form-data" method="POST">

然后使用POST动作:

[HttpPost]
protected virtual ActionResult CreateEntity(TEditViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
于 2018-07-05T14:44:06.857 回答