通过视图将值从控制器传递到控制器

本文关键字:控制器 视图 | 更新日期: 2023-09-27 18:14:38

我有两个类,其中一个是另一个的父类。基本CRUD函数是在控制器中创建的。在表的设计中,我将子类中的父id作为外键。在子函数的Create视图中,我被要求输入父ID。我已经更改了Create以接受父节点的ID。但当我删除在视图中选择父id的代码时,我在Create中得到异常。有没有一种方法,我可以设置父ID在我的两个创建函数(重载函数)。

    public ActionResult Create(int? id)
    {
        ViewBag.LsystemID = new SelectList(db.Lsystem, "LsystemID", "LsystemName",id);
        ViewBag.TCID = new SelectList(db.TC, "TCID", "TCName");
        return View();
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "OptionID,OptionName,TCID,LsystemID")] Option option)
    {
        if (ModelState.IsValid)
        {
            db.Option.Add(option);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    //    ViewBag.LsystemID = new SelectList(db.Lsystem, "LsystemID", "LsystemName", op);
        ViewBag.TCID = new SelectList(db.TC, "TCID", "TCName", option.TCID);
        return View(option);
    }
<<p> 视图/strong>
@using (Html.BeginForm()) 
{
@Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.LabelFor(model => model.OptionName, htmlAttributes: new { @class = "control-label col-md-2" })
    @Html.EditorFor(model => model.OptionName, new { htmlAttributes = new { @class = "form-control" } })
    @Html.ValidationMessageFor(model => model.OptionName, "", new { @class = "text-danger" })
    @Html.LabelFor(model => model.TCID, "TCID", htmlAttributes: new { @class = "control-label col-md-2" })
    @Html.DropDownList("TCID", null, htmlAttributes: new { @class = "form-control" })
    @Html.ValidationMessageFor(model => model.TCID, "", new { @class = "text-danger" })
    @Html.LabelFor(model => model.LsystemID, "LsystemID", htmlAttributes: new { @class = "control-label col-md-2" })
    @Html.DropDownList("LsystemID", null, htmlAttributes: new { @class = "form-control" })
    @Html.ValidationMessageFor(model => model.LsystemID, "", new { @class = "text-danger" })
    <input type="submit" value="Create" class="btn btn-default" /> 
}

如何传递值LsystemID而不显示在视图中?

编辑1:添加Model类
 public class Lsystem
{
    public int LsystemID { get; set; }
    public string LsystemName { get; set; }
    public virtual ICollection<Option> Options { get; set; }
  //  public int OptionId { get; set; }
}
public class Option
{
    public int OptionID { get; set; }
    public string OptionName { get; set; }
    public int TCID { get; set; }
    public virtual TC tc { get; set; }
    public virtual Lsystem Lsystem { get; set; }
    public int LsystemID { get; set; }
    public virtual ICollection<OptionValue> OptionValues { get; set; }
}

通过视图将值从控制器传递到控制器

首先创建一个视图模型,表示视图中需要的内容(根据需要添加验证和显示属性)

public class OptionVM
{
  public int Lsystem { get; set; }
  public string Name { get; set; }
  public int TC { get; set; }
  public SelectList TCList { get; set; }
}

和控制器

public ActionResult Create(int? id)
{
  OptionVM model = new OptionVM
  {
    Lsystem = id // set the parent
  };
  ConfigureViewModel(model);
  return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(OptionVM model)
{
  if (!ModelState.IsValid)
  {
    ConfigureViewModel(model);
    return View(model);
  }
  Option option = new Option
  {
    OptionName = model.Name,
    TCID = model.TC,
    LsystemID= model.Lsystem
  };
  db.Option.Add(option);
  db.SaveChanges();
  return RedirectToAction("Index");
}
private void ConfigureViewModel(OptionVM model)
{
  model.TCList = new SelectList(db.TC, "TCID", "TCName");
}

和视图

@model OptionVM
@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()
  @Html.HiddenFor(m => m.Lsystem)
  @Html.LabelFor(m => m.Name)
  @Html.TextBoxFor(m => m.Name)
  @Html.ValidationMesageFor(m => m.Name)
  @Html.LabelFor(m => m.TC)
  @Html.DropDownListFor(m => m.TC, Model.TCList, "Please select")
  @Html.ValidationMesageFor(m => m.TC)
  <input type="submit" ... />
}