簡體   English   中英

如何在復雜的ViewModel中綁定IDictionary?

[英]How to bind IDictionary in complex ViewModel?

我有字典字段的復雜viewModel。

public class FieldViewModel
    {
        public int Id { get; set; }

        public int Type { get; set; }

        public string Name { get; set; }

        public string Additional { get; set; }

        public Dictionary<string, string> Options = new Dictionary<string, string>(); 

        public ViewState ViewState = ViewState.Save;

        public IList<SelectListItem> Types = new List<SelectListItem>();

        public static FieldViewModel BuildFieldVIewModel(Field fieldEntity = null)
        {
            FieldViewModel viewModel = new FieldViewModel();
            viewModel.Options.Add("key1","val1"); //just for test
            viewModel.Options.Add("key2","val2");
            if (fieldEntity != null)
            {
                viewModel.Id = fieldEntity.Id;
                viewModel.Type = fieldEntity.Type;
                viewModel.Name = fieldEntity.Name;
                viewModel.Additional = fieldEntity.Additinal;
                viewModel.ViewState = ViewState.Edit;
            }

            viewModel.Types = Enum.GetValues(typeof(FieldType)).Cast<FieldType>().Select(x => new SelectListItem {
            Value = ((int)x).ToString(CultureInfo.InvariantCulture),
            Text = Enum.GetName(typeof(FieldType), x),
            Selected = fieldEntity != null && ((int)x) == fieldEntity.Id
            }).ToList();

            return viewModel;
        }
    }

和剃刀視圖

@using (Html.BeginForm("Save", "Dictionary", FormMethod.Post))
{
    var index = 0;
    @Html.HiddenFor(m => m.FieldId);
    foreach (KeyValuePair<string, string> kv in Model.Options)
    {
        <div class="row">
            <div class="col-md-2">
           <input type="text" name="@string.Format("Options[{0}].Key", index)" value="@kv.Key" />
        </div>
        <div class="col-md-2">
            <input type="text" name="@string.Format("Options[{0}].Value", index)" value="@kv.Value" />
        </div>            </div>
        index++;
    }
    <input type="submit" value="Save" />
}

呈現的html是

<form action="/Dictionary/1/Save" method="post"><input data-val="true" data-val-number="The field FieldId must be a number." data-val-required="The FieldId field is required." id="FieldId" name="FieldId" type="hidden" value="1">        <div class="row">
            <div class="col-md-2">
               <input type="text" name="Options[0].Key" value="key1">
            </div>
            <div class="col-md-2">
                <input type="text" name="Options[0].Value" value="val1">
            </div>
        </div>
        <div class="row">
            <div class="col-md-2">
               <input type="text" name="Options[1].Key" value="key2">
            </div>
            <div class="col-md-2">
                <input type="text" name="Options[1].Value" value="val2">
            </div>
        </div>
    <input type="submit" value="Save">
</form>

但是在行動方法中,我的詞典是空的。

[HttpPost]
public ActionResult Save(FieldViewModel viewModel)
{
    if (viewModel.Options.Count == 0)
    {
        throw new Exception("Dictionary is empty.");
    }
    return RedirectToAction("Index", new { fieldId = 1 });
}

我必須使用哪個名稱正確綁定viewModel中的字典?

更改

public Dictionary<string, string> Options = new Dictionary<string, string>();

public Dictionary<string, string> Options {get;set;}

並添加

Options = new Dictionary<string, string>(); 

到您的構造函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM