3

关键词:asp.net mvc 3、复选框列表、强类型视图。

所以,请不要建议我使用 ViewBag 或 formcollection。

我对 web 表单开发并不陌生,但我对 asp.net MVC 相当陌生。

假设在注册页面上,我有这样的东西:

一个非常简单的注册表单

视图模型会是什么样子?以下看起来对吗?

public class RegistrationViewModel

{

// To store the selected state ID upon postback.
public int StateId {get; set; }  

// A list of states to populate the dropdown.
public Dictionary<int, string> States {get; set; } 

// To store the list of insurance companies the user has used before.
public int[] PriorInsuranceCompanies {get; set; } 

// A list of insurance companies to populate the check box list.
public Dictionary<int, string> InsuranceCompanies {get; set; }

}

我知道如何创建我在屏幕截图中显示的视图,但我不确定我应该如何在我的控制器中捕获用户输入的视图模型值。请记住,我更喜欢强类型视图。mvc 框架如何分辨哪个是哪个?您是否有一个最小的工作示例可以共享(最好是在一个完整的可运行项目中)?谢谢你。

4

1 回答 1

4

您使用的方法是正确的。我同意你总是使用视图模型而不是 ViewBag。

在您的视图模型中,您应该将字典更改为 MultiSelectList,以便您也可以拥有选定的值。

public IList<int> PriorInsuranceCompaniesSelected { get; set; }
public MultiSelectList PriorInsuranceCompanies { get; set; }

然后,如果已经选择了一些 Id(例如从存储库加载数据时获得的信息),则映射第一个字段,然后映射所有值的第二个字段。

从 Get 部分的控制器中(仅以一些代码为例):

  model.PriorInsuranceCompaniesSelected = new List<int>();
  var companies = repository.GetPriorInsuranceCompanies();
  //add to your PriorInsuranceCompaniesSelected the values already checked from your entity
  var entity = repository.GetEntityBy(id);
  if (entity.PriorInsuranceCompanies != null)
    foreach (var item in entity.PriorInsuranceCompanies)
      model.PriorInsuranceCompaniesSelected.Add(item.Id);

  var select = (from s in companies select new { Id = s.Id, Name = s.Name }).OrderBy(x => x.Name); //.ToList;
  model.PriorInsuranceCompanies = new MultiSelectList(select, "Id", "Name", model.PriorInsuranceCompaniesSelected);

然后在您的 Html 中,您将有这样的输出

@foreach (var item in Model.PriorInsuranceCompanies)
{
   <label for="@item.Value" class="check">
   <input type="checkbox" id="@item.Value" name="PriorInsuranceCompaniesSelected" value="@item.Value" @(item.Selected ? "checked" : "") />@item.Text</label>
}

在发布时,ModelBinder 会自动将正确的对象映射到您的模型。您只需检查 model.PriorInsuranceCompaniesSelected 中的值

[HttpPost]
public ActionResult MyForm(MyViewModel model)
{
  if (ModelState.IsValid)
  {
    try
    {
      //your mapping code or whatever...

      //You do your things with the selected ids..
      if (model.PriorInsuranceCompaniesSelected != null && model.PriorInsuranceCompaniesSelected.Count > 0)
        entity.PriorInsuranceCompanies = repository.GetCompaniesBy(model.PriorInsuranceCompaniesSelected);
      else
        entity.PriorInsuranceCompanies = new List<Comapny>();
      repository.Save(entity);

      return RedirectToAction("Index");
    }
    catch (RulesException ex)
    {
      ex.CopyTo(ModelState);
    }
    catch
    {
      ModelState.AddModelError("", "My generic error taken form a resource");
    }
  }

  //rehydratates the list in case of errors
  //....
  return View(model);
}

这应该让您知道该怎么做。我希望它有帮助

于 2012-05-18T03:35:58.143 回答