【问题标题】:Webmatrix: passing ModelState to partial pageWebmatrix:将 ModelState 传递给部分页面
【发布时间】:2011-05-09 20:26:39
【问题描述】:

我正在构建一个网页站点,但在尝试将 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 之间共享。

【问题讨论】:

    标签: razor webmatrix


    【解决方案1】:

    ModelStateSystem.Web.WebPages.WebPage 类的只读属性。它的支持字段是一个私有的 ModelStateDictionary 并且在第一次访问时被初始化。我看不到任何强制 ModelState 跨页面的方法,除了通过 SO 问题中看到的反射进行此操作:Can I change a private readonly field in C# using reflection?

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

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

    实际上,页面名称后面的第一个参数会成为新页面的Model,所以有足够的空间(即下一个参数)来传递ModelState。

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

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

    【讨论】:

    • 这就是我正在寻找的答案。
    猜你喜欢
    • 2014-04-05
    • 2023-03-11
    • 1970-01-01
    • 2013-03-20
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多