【问题标题】:How to post dropdownlist viewbag values to sql server using mvc 4?如何使用 mvc 4 将下拉列表 viewbag 值发布到 sql server?
【发布时间】:2015-01-19 07:18:35
【问题描述】:

我通过 viewbag 在下拉列表中获取动态值,下拉列表值显示正常,但我的问题是发布,我在 sql server 中插入下拉列表值时遇到问题,请帮我解决这个问题。

这是我的模型页面,

public class RegisterModel
{
  public Prefix Prefix { get; set; }
}

public class Prefix
{
  public int? ID { get; set; }
  public string Name { get; set; }      
}

这是我的控制器页面,

void BindPrefix()
{
  List<Prefix> lstPrefix = new List<Prefix>()
  {
    new Prefix { ID = null, Name = "Select" },
    new Prefix { ID = 1, Name = "Mr" },
    new Prefix { ID = 2, Name = "Ms" },
    new Prefix { ID = 1, Name = "Mrs" },
    new Prefix { ID = 2, Name = "Dr" }
  };
  ViewBag.Prefix = lstPrefix;
}

public ActionResult Register()
{
  BindPrefix();     
  return View();
}

[HttpPost]       
public ActionResult Register(FormCollection FC)
{
  string Prefix =FC[ViewBag.Prefix]; // here prefix get null value.
  return view();
}

这是我的查看页面,

@Html.DropDownListFor(m => m.Prefix.ID, new SelectList(ViewBag.Prefix, "ID", "Name", ViewBag.pef))

【问题讨论】:

  • ViewBag 信息在每个请求中都会持续存在,这就是为什么在 post 操作中 ViewBag.Prefix 等于 null 的原因。
  • 你的视图是基于模型RegisterModel所以发回模型public ActionResult Register(RegisterModel model)这将被正确绑定
  • 我使用了 ActionResult 但我也显示为 null,因为 Prefix 是布尔数据类型
  • Prefixnot 类型的 boolean。它是一个包含属性int? IDstring Name 的复杂类型,您应该将ViewBag 属性更改为另一个名称,例如ViewBag.PrefixList = lstPrefix; 并删除 SelectList 构造函数的第 4 个参数
  • 并从lstPrefix 中删除第一项,改为使用@Html.DropDownListFor(m =&gt; m.Prefix.ID, new SelectList(ViewBag.PrefixList, "ID", "Name"), "Select")。为什么你的 ID 值不是唯一的(你有两个“1”和两个“2”)——你怎么知道选择了什么?以及为什么你仍然需要一个复杂的属性 - 只选择一个字符串(“先生”,女士“等)有什么问题

标签: asp.net-mvc-4


【解决方案1】:

如果您尝试获取选定值,则必须从生成的下拉名称中获取:

string Prefix =FC["Prefix"]; 

目前是这样的:

@Html.DropDownListFor(m => m.Prefix.ID, new SelectList(ViewBag.Prefix, "ID", "Name", ViewBag.pef))

会生成这个html:

<select id="Prefix_ID" name="Prefix.ID">
.........
.........
</select>

并在表单集合中使用元素名称将为您提供价值。

string Prefix =FC["Prefix.ID"].ToString(); 

【讨论】:

  • 它将生成&lt;select id="Prefix_ID" name="Prefix.ID"&gt; 所以它的string Prefix =FC["Prefix.ID"];
  • 感谢先生回复,如何在html中生成下拉列表
  • 当我将下拉列表保存在 html 中时,查看输出未在下拉列表中显示值,如何在 html
  • 你说的没错,我得到了输出,感谢每一个人...我得到了基于 id 的输出,但我需要基于名称的输出,请帮助我。
  • 你的意思是,你想公布名字??
【解决方案2】:

基于您只想显示和回发“标题”的 cmets,似乎没有必要使用 Prefix

查看模型

public class RegisterViewModel
{
  [Required(ErrorMessage = "Please select a title")]
  public string Title { get; set }
  // other properties
  public SelectList TitleList { get; set; }
}

控制器

public ActionResult Register()
{
  RegisterViewModel model = new RegisterViewModel();
  ConfigureViewModel(model);
  return View(model);
}

[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
  if(!ModelState.IsValid)
  {
    ConfigureViewModel(model);
    return View(model);
  }
  // save and redirect
}

private void ConfigureViewModel(RegisterViewModel model)
{
  List<string> titles = new List<string>) { "Mr.", "Ms", "Mrs", "Dr." };
  model.TitleList = new SelectList(titles);
}

查看

@model RegisterViewModel
...
@using (Html.BeginForm())
{
  @Html.LabelFor(m => m.Title)
  @Html.DropDownListFor(m => m.Title, Model.TitleList, "-Please select-")
  @Html.ValidationMessageFor(m => m.Title)
  ....
}

【讨论】:

  • 我猜不是。祝您在未来获得任何帮助时好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
相关资源
最近更新 更多