0

我有一个带有一些服务器端验证的页面。它的工作原理是,在服务器验证失败时,它会显示相同的页面,并在输入数据的表单上方显示一个带有验证错误的框。

我的问题是页面顶部有一大堆其他东西,所以用户没有被引导到错误框,实际上它可能不在屏幕上。错误在 div #server_errors 中。我想要的是告诉控制器返回视图,但跳转到错误部分,与将 #server_errors 附加到 url 相同。

控制器返回如下:

public ActionResult ChangeRiskCategory(Guid id)
{
    //...
    //call server side method,  handle errors
    //...
    return View("ChangeRiskCategory", changeRiskCategoryModel);
}

我现在看不到将 div id 注入视图的方法。我可以看到验证客户端可以解决这个问题,但它需要在没有启用 js 的情况下工作,所以我认为这可以排除。

4

3 回答 3

1

你可以尝试这样的事情:

public ActionResult ChangeRiskCategory(Guid id, bool error = false)
{
    //...
    //call server side method,  handle errors
    //...
    if (!error && !ModelState.IsValid /*or other way of working out the error will be displayed*/)
    {
        return Redirect(Url.Action("ChangeRiskCategory") + "?id=" + id + "&error=true#server_error");
    }
    return View("ChangeRiskCategory", changeRiskCategoryModel);

}

(“error”参数是为了阻止它无休止地重定向)

如果您改变主意使用 javascript,您可以简单地发出:

location.href='#server_errors';
于 2012-04-18T14:52:32.547 回答
1

将 div id 作为 ViewModel 的属性传递给 View 怎么样?然后你可以在视图中用 Javascript 做任何你想做的事情。毕竟,ViewModel 代表了 View 的数据和状态。

于 2012-04-16T14:09:34.410 回答
0

使用基于模型的验证并让您查看看起来像这样

@model SampleApplication.Models.BasicDemoModel

<form id="AjaxForm" action="/">
    <table>
        <tr>
            <td>@Html.LabelFor(x => x.Name)</td>
            <td>
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name, "*")
            </td>
        </tr>
        <tr>
            <td>@Html.LabelFor(x => x.Email)</td>
            <td>
                @Html.TextBoxFor(x => x.Email)
                @Html.ValidationMessageFor(x => x.Email, "*")
            </td>
        </tr>
        @{
            Html.RenderPartial("Address", Model);
        }
    </table>
    @if (!string.IsNullOrWhiteSpace(Model.Message))
    {
        <h2>@Model.Message</h2>
    }
    @if (!ViewContext.ViewData.ModelState.IsValid)
    {
        @Html.ValidationSummary()
    }
    <input type="submit" title="Submit Form" onclick="PostFormWithAjax();return false;" />
</form>

如果您需要额外的验证消息,您可以像这样将其添加到更多状态

public ActionResult ChangeRiskCategory(Guid id)
{
    //...
    //call server side method,  handle errors
    //...
    ModelState.AddModelError("MyInput","This isn't Right");
    return View("ChangeRiskCategory", changeRiskCategoryModel);
 }
于 2012-04-16T14:35:13.210 回答