Asp.net mvc 如何使用强类型视图获取asp.net mvc 3中复选框列表的选中值?

Asp.net mvc 如何使用强类型视图获取asp.net mvc 3中复选框列表的选中值?,asp.net-mvc,strongly-typed-view,Asp.net Mvc,Strongly Typed View,关键词:asp.net mvc 3,复选框列表,强类型视图 所以,请不要建议我使用ViewBag或formcollection 我对web表单开发并不陌生,但我对asp.NETMVC相当陌生 假设在注册页面上,我有如下内容: 视图模型是什么样子的?以下内容看起来正确吗 public class RegistrationViewModel { //在回发时存储选定的状态ID。 public int StateId{get;set;} //要填充下拉列表的状态列表。 公共字典状态{get;set

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

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

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

假设在注册页面上,我有如下内容:

视图模型是什么样子的?以下内容看起来正确吗

public class RegistrationViewModel
{

//在回发时存储选定的状态ID。
public int StateId{get;set;}
//要填充下拉列表的状态列表。
公共字典状态{get;set;}
//存储用户以前使用过的保险公司列表。
公共int[]优先保险公司{get;set;}
//要填充复选框列表的保险公司列表。
公共字典保险公司{get;set;}
}


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

您使用的方法是正确的。我同意您使用always viewmodels和never ViewBag

在viewmodel中,您应该将字典更改为MultiSelectList,以便也可以使用选定的值

public IList<int> PriorInsuranceCompaniesSelected { get; set; }
public MultiSelectList PriorInsuranceCompanies { get; set; }
public IList优先级保险公司已选中{get;set;}
公共多选列表优先保险公司{get;set;}
然后,如果已经选择了某些ID(例如从repo加载数据时获得的信息),则映射第一个字段,第二个字段映射所有值

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

model.PriorInsuranceCompaniesSelected=新列表();
var companies=repository.GetPriorInsuranceCompanies();
//添加到优先保险公司已从实体中选择已检查的值
var entity=repository.GetEntityBy(id);
if(entity.PriorInsuranceCompanies!=null)
foreach(实体中的var项目。优先保险公司)
已选择型号优先保险公司。添加(项目Id);
var select=(从公司中的s选择新的{Id=s.Id,Name=s.Name})。托利斯特;
model.PriorInsuranceCompanies=新的多选列表(选择“Id”、“名称”,model.PriorInsuranceCompanies已选中);
然后在你的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>
}
@foreach(Model.PriorInsuranceCompanies中的var项)
{
@项目.案文
}
在post上,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);
}
[HttpPost]
公共行动结果MyForm(MyViewModel模型)
{
if(ModelState.IsValid)
{
尝试
{
//你的映射代码或者其他什么。。。
//您可以使用所选ID执行操作。。
如果(model.priorinsurancecompanieselected!=null&&model.priorinsurancecompanieselected.Count>0)
entity.PriorInsuranceCompanies=repository.GetCompaniesBy(model.PriorInsuranceCompaniesSelected);
其他的
entity.PriorInsuranceCompanies=新列表();
保存(实体);
返回操作(“索引”);
}
捕获(规则例外)
{
例如CopyTo(ModelState);
}
抓住
{
AddModelError(“,“我的通用错误来自资源”);
}
}
//在出现错误的情况下对列表进行重新水化
//....
返回视图(模型);
}
这会让你知道该怎么做。我希望有帮助

@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>
}
[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);
}