Webmatrix:将ModelState传递给部分页面

时间:2011-05-09 20:26:40

标签: razor webmatrix

我正在构建一个WebPages网站,当我尝试将ModelState数据传递到部分网页时出现问题。

以下是Create.cshtml的代码:

@{
    Page.Title = "Create Fund";

    var name = "";

    if (IsPost) {
        name = Request.Form["name"];

        if (!name.IsValidStringLength(2, 128)) {
            ModelState.AddError("name", "Name must be between 2 and 128 characters long.");
        }
    }
}

@RenderPage("_fundForm.cshtml", name)

以下是_fundForm.cshtml的代码:

@{
    string name = PageData[0];
}

<form method="post" action="" id="subForm">
    <fieldset>
        @Html.ValidationSummary(true)
        <legend>Fund</legend>
        <p>
            @Html.Label("Name:", "name")
            @Html.TextBox("name", name)
            @Html.ValidationMessage("name", new { @class = "validation-error" })
        </p>
        <p>
            <input type="submit" name="submit" value="Save" />
        </p>
    </fieldset>
</form>

我遇到的问题是“名称”出错时,验证错误不会显示。有没有一种特殊的方法可以在两个页面之间传递ModelState

_fundForm将在Create.cshtml和Edit.cshtml之间共享。

1 个答案:

答案 0 :(得分:3)

ModelState System.Web.WebPages.WebPage 类的只读属性。其支持字段是私有 ModelStateDictionary ,并在首次访问时初始化。我无法看到任何方法强制 ModelState 跨页面,除了通过反思做,如SO问题所示:Can I change a private readonly field in C# using reflection?

否则,您可以在调用中使用第三个参数,如下所示:

@RenderPage("_fundForm.cshtml", name, ModelState);

实际上,页面名称后面的第一个参数将成为新页面的模型,因此有足够的空间(即下一个参数)来传递ModelState。

在你的“_fundForm.cshtml”合并中,调用页面收到的ModelState与本地的一样,如下所示:

@{
    //In _fundForm.cshtml
    var ms = PageData[1];
    ModelState.Merge((ModelStateDictionary)ms);
}