如何在Http Post之后保留url(使用查询字符串)但是还会向模型状态添加错误?

The*_*lla 6 c# asp.net-mvc query-string asp.net-mvc-3

基本上我想要做的是通过让用户输入他们的帐户和他们的社会安全号码来验证用户.如果他们输入的组合不正确,我会在Authenticate后期操作中执行以下操作:

ModelState.AddModelError("Authenticated", authenticationError);
return View();
Run Code Online (Sandbox Code Playgroud)

这会显示错误,但后来我丢失了查询字符串中的内容.保留查询字符串的替代方法是:

ModelState.AddModelError("Authenticated", authenticationError);
return Redirect(Request.Url + "?returnUrl=" + returnUrl);
Run Code Online (Sandbox Code Playgroud)

这将保留查询字符串,但不会显示错误.我认为这是因为ModelState已经改变了.

我需要这个,returnUrl因为Authenticate只要用户点击查看特定事件,就会强制他们访问该页面.我想设置它,以便他们在验证自己后仍然可以参加此活动.

有没有办法可以同时保存查询字符串并显示模型错误?

Jay*_*Jay 5

第二种情况没有模型状态,因为当您进行重定向时,浏览器会向该位置发出单独的请求,单独的请求=新的模型状态。

我建议您使用第一个方案,并在模型中放置一个“ ReturnUrl”,并将其作为隐藏字段呈现给客户端。

//In your model add the ReturnUrl Property
public class AuthenticatModel
{
     public string Account {get; set;}
     public string SocialSecurityNumber {get;set;}
     public string ReturnUrl {get;set;}
}



ModelState.AddModelError("Authenticated", authenticationError);
//Set the return URL property before returning the view
model.ReturnUrl = returnUrl;
return View(model);


@* add the return URL as a hidden field to your view so it can be posted back *@
@Html.HiddenFor(model => model.ReturnUrl)
Run Code Online (Sandbox Code Playgroud)

  • 相反,将其放在模型中会使它更整洁,因为查看模型将向您显示视图中需要显示的内容。Viewbag使您的实现变得模糊。 (4认同)

Sha*_*rpC 5

伊万Korytin的回答是最好的(也是唯一的答案我能找到这似乎不实际使用隐藏域黑客正常工作),我已经提高了一点点Request.QueryString

您必须将参数作为表单操作的一部分:

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

当您执行以下操作时,查询字符串(和GET参数)现在将保留:

[HttpPost]
public ActionResult MyAction(MyAction model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
Run Code Online (Sandbox Code Playgroud)