【问题标题】:Send single value through RouteValueDictionary通过 RouteValueDictionary 发送单个值
【发布时间】:2014-03-07 19:37:08
【问题描述】:

我的 ViewModel 的一个属性是一个数组,不幸的是,每次我发回控制器时它都是 null。我想出了一个简单的技巧,将值放入逗号分隔的字符串中。

这对我们的分页插件非常有用,它使用RouteValueDictionary 回发到我们的Index 方法。但是,它在Html.BeginForm 帮助器中不起作用,该帮助器回发到不同的控制器操作(Update 方法)。

查看

@*Since we can't send arrays or complex objects break array down into string for RouteValueDictionary*@
var channelCodes = "";
for (int i = 0; i < Model.searchChannelCode.Length; i++)
{
    channelCodes += Model.searchChannelCode[i];

    if (i + 1 < Model.searchChannelCode.Length)
    {
        channelCodes += ",";
    }
}  

@*The 'searchChannelCodesPagin' variable from this RouteValueDictionary always posts back as null
using (Html.BeginForm("Update", "ZipCodeTerritory", new RouteValueDictionary()
    {
        {"searchChannelCodesPaging", channelCodes }
    }, FormMethod.Post, new {id = "UpdateForm"}))
{
    @Html.HiddenFor(model => model.searchZip)
    @Html.HiddenFor(model => model.searchTerritory)
    @Html.HiddenFor(model => model.searchState)
    @Html.HiddenFor(model => model.searchActiveOnly)
    @Html.HiddenFor(model => model.zipCodeTerritory)

    <div id="cloneBox">
        <div id="rw1">
            @Html.LabelFor(model => model.newTerritory)
            @Html.TextBoxFor(model => model.newTerritory, new { style = "width: 30px;padding-left:10px;", maxLength = 3 })
            @Html.LabelFor(model => model.newDescription)
            @Html.TextBoxFor(model => model.newDescription, new { style = "width: 250px;padding-left:10px;", maxLength = 30 })  
            @Html.LabelFor(model => model.newEffectiveDate)     
            @Html.TextBoxFor(model => model.newEffectiveDate, new { style = "width: 80px;padding-left:10px;" }) 
            <div id="rw2" style="padding-top: 10px;">
                @Html.LabelFor(model => model.newChannelCode)
                @Html.DropDownListFor(model => model.newChannelCode, Model.ChannelCodes, " ")
                @Html.LabelFor(model => model.newStateCode)
                @Html.DropDownListFor(model => model.newStateCode, Model.StateCodes, "  ")
                @Html.LabelFor(model => model.newEndDate)
                @Html.TextBoxFor(model => model.newEndDate, new { style = "width: 80px;" })
            </div>                                 
        </div>
    </div>
    <br/>
    <div id="buttonDiv">
        <button type="submit" id="CloneButton" name="button" value="clone">Apply New Data</button>
        <button type="submit" id="deleteButton" name="button" value="delete">Delete Selected Items</button> 
        <button type="submit" id="removeButton" name="button" value="removeErrors">Remove Selected Errors</button>           
    </div>

}

控制器

上面的形式发布到这个控制器动作。 searchChannelCodePaging 变量每次都为空。

    [HttpPost]
    public ActionResult Update(ZipCodeIndex updateZip, string button, string searchChannelCodesPaging)
    {

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor routevalues


    【解决方案1】:

    由于您正在发布帖子,因此将其发送到后端的最简单方法是添加隐藏字段:

    @Html.HiddenFor("searchChannelCodesPaging", searchChannelCodesPaging);
    

    作为路由值,您可能需要通过以下两种方法之一在控件中显式获取它。这些对象可以在 Controller 类中直接访问。

    RouteData.Values("searchChannelCodesPaging")
    Request.QueryString.Get("searchChannelCodesPaging");
    

    【讨论】:

    • HiddenFor 助手似乎不喜欢这种格式(我假设代码中的第二个参数是我在视图中创建的逗号分隔的var channelCodes?)。我是否需要以某种方式分配var
    • 没关系,明白了:@Html.Hidden("searchChannelCodesPaging", channelCodes)
    【解决方案2】:

    您不必将数组类型模型参数序列化为 CSV 字符串即可将其发布到您的控制器。你可以这样做:

    @for (var i = 0; i < Model.searchChannelCode.Length; i++)
    {
        @Html.HiddenFor(m => m.searchChannelCode[i]);
    }
    

    【讨论】:

    • 控制器参数中HiddenFor通道代码的动态数量如何计算?
    • 一个参数IList&lt;string&gt; searchChannelCode
    猜你喜欢
    • 2013-12-24
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2018-02-25
    • 2016-11-25
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多