gpt4 book ai didi

.net - 如何将选择列表与 View 模型绑定(bind)?

转载 作者:行者123 更新时间:2023-12-04 13:29:00 25 4
gpt4 key购买 nike

我无法将选择列表绑定(bind)到我的 ViewModel。

我有一个 ViewModel,其中包含一个 Question 实体和一个字符串

   public class QuestionViewModel
{
public Question Question { get; set; }
public string RefUrl { get; set; }

public QuestionViewModel()
{
}

public QuestionViewModel(Question question, string RefUrl)
{
this.Question = question;
this.RefUrl = RefUrl;
}

public QuestionViewModel(Question question)
{
this.Question = question;
this.RefUrl = "";
}
}

这是 Controller :
public ActionResult Edit(int id)
{
Question question = db.Question.Single(q => q.question_id == id);
QuestionViewModel qvm = new QuestionViewModel(question);
ViewBag.category_id = new SelectList(db.Category, "category_id", "category_name", qvm.Question.category_id);
ViewBag.type_code = new SelectList(db.Question_Type, "type_code", "type_description", qvm.Question.type_code);
return View(qvm);
}

我认为的代码如下所示:
<div class="editor-label">
@Html.LabelFor(model => model.Question.type_code, "Question_Type")
</div>
<div class="editor-field">
@Html.DropDownListFor(model => Model.Question.Question_Type, (SelectList)ViewBag.type_code)
@Html.ValidationMessageFor(model => model.Question.type_code)
</div>

View 确实将问题实体的 Question_Type 设置为所选值,但是当我提交表单时,
ValidationMessageFor 触发器??

最佳答案

你有的是不是 View 模型 .这是一个混合类,您已将其称为 View 模型,并且您在其中包装了域实体 (Question)。这很糟糕,不要这样做。

这是我要推荐给你的。首先设计一个真实的 View 模型,它将反射(reflect)您的 View 要求(根据您当前的描述,它是一个包含一些问题类型并允许用户从此 ddl 中选择一些问题类型的下拉列表):

public class QuestionViewModel
{
[DisplayName("Question_Type")]
public string SelectedQuestionType { get; set; }

public IEnumerable<SelectListItem> QuestionTypes { get; set; }

// didn't see where you are using this on your view
public string RefUrl { get; set; }
}

然后在域模型和 View 模型之间映射 Controller 。当然,进一步的改进是使用 AutoMapper为了避免这种映射遍布您的 Controller 操作:
public ActionResult Edit(int id)
{
var question = db.Question.Single(q => q.question_id == id);
var qvm = new QuestionViewModel
{
// preselect a value
SelectedQuestionType = question.type_code,
QuestionTypes = db.Question_Type.Select(x => new SelectListItem
{
Value = x.type_code,
Text = x.type_description
})
};
return View(qvm);
}

进而:
<div class="editor-label">
@Html.LabelFor(x => x.SelectedQuestionType)
</div>
<div class="editor-field">
@Html.DropDownListFor(
x => SelectedQuestionType,
new SelectList(Model.QuestionTypes, "Value", "Text")
)
@Html.ValidationMessageFor(x => x.SelectedQuestionType)
</div>

最后一句话:确保你已经摆脱了任何 ViewBag/ViewData丑陋并将您的 View 需要的任何东西放入 View 模型中。您在 Controller 操作中显示了一些类别,这些类别未在您显示的 View 片段中具体化。如果您需要它们,只需将它们放在您的 View 模型中,就像我们对问题类型所做的那样。

关于.net - 如何将选择列表与 View 模型绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6623700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com