加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – 如何使用viewmodel绑定选择列表?

发布时间:2020-12-16 00:04:01 所属栏目:asp.Net 来源:网络整理
导读:我无法获得一个绑定到我的ViewModel的选择列表. 我有一个ViewModel,它包含一个Question实体和一个字符串 public class QuestionViewModel{ public Question Question { get; set; } public string RefUrl { get; set; } public QuestionViewModel() { } publ
我无法获得一个绑定到我的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 = "";
    }
}

这是控制器:

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实体的Question_Type设置为所选值,但是当我提交表单时,
ValidationMessageFor触发器?

解决方法

你拥有的不是一个视图模型.它是一个混合类,你称之为视图模型,并且你已经包装了你的域实体(问题).这很糟糕,不要这样做.

这是我建议你的.首先设计一个真实的视图模型,它将反映您视图的要求(从您当前的描述中,它是一个包含一些问题类型的下拉列表,并允许用户从此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; }
}

然后让您的控制器映射到您的域模型和视图模型之间.当然,进一步的改进是使用AutoMapper来避免遍布控制器操作的这种映射:

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的丑陋,并将你的视图需要放到视图模型中.您已在控制器操作中显示了一些类别,这些类别未在您显示的视图片段中显示.如果您需要它们,只需将它们放在视图模型中,就像我们对问题类型所做的那样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读