-1

我的问题在这里打了 1000 次。所以我会尽量做到描述性。

我在布局中有来自不同模型的多个视图。从列表中选择记录时,它会打开此布局。在布局的顶部,它以表格格式显示记录信息。这是一个简单的 ID - /AuditSchedule/1122。这是目前的身体。这行得通。

在布局的另一个区域中,我有一个从另一个表生成的操作链接列表(侧面菜单)。我认为链接应该如下但不确定/AuditSchedule/1122/1。这是通过使用带有路由的 Global.asax 来完成的。

自然,当您打开此布局时,您应该得到以上所有内容以及布局的下一个区域(即表单)的第一条记录。在这种形式中,我需要它从问题表中显示一个问题,并在问题的右侧创建一组复选框,我将称之为分数。这些分数也在一个称为分数的表中。我在其中的所有内容几乎都在数据表中,因此可以根据需要编辑和更改所有内容。

当用户提交表单时,它将在另一个名为 MainAnswers 的表中存储 auditSchedule、mainQuestion 的 id 和分数字符串。该表是一个空白表,因此它将为该 AuditSchedule 的每个主要问题插入一条新记录。

到目前为止,我在这方面没有任何帮助。如果有人能指出他们看到的一个例子。那会很好。我不能是唯一一个试图这样做的人。但是我是 MVC C# 的新手。如果这是 Zend 和 PHP,我不会有任何问题。

我使用了代码优先的方法。我所有的关系都完成了。问题在于实现视图并将信息保存在正确的表中。

任何可以提供帮助的人将不胜感激。我在这里挣扎。

更新于 2012 年 8 月 16 日下午 3:12

让我先迈出第一步。

我希望能够从侧面选择一个菜单项,并从该部分列出一个问题列表。这是我的代码:

@{ Layout = null; }
@model QQAForm.ViewModels.AuditFormEdit

<table width="698" border="2" cellpadding="2">
<tr>
<td align="center"><b>Section</b><br />1.0</td>
<td>

<br />(Title of Section Goes Here - SubcategoryName - Located in Subcategory Model)<br />


<br />

(Child Questions Go here - QuestionText - Located in ChildQuestion Model)

</td>
<td>
        (This should be the result of what is written in AuditFormEdit view model - it does not currently work - Nothing shows up)
        @for (int index = 0; index < Model.ScoreCardCheckBoxHelperList.Count; index++)
        {

            @Html.CheckBoxFor(m => m.ScoreCardCheckBoxHelperList[index].Checked)
            @Html.LabelFor(m => m.ScoreCardCheckBoxHelperList[index], Model.ScoreCardCheckBoxHelperList[index].ScoreName)
            @Html.HiddenFor(m => m.ScoreCardCheckBoxHelperList[index].ScoreID)
            @Html.HiddenFor(m => m.ScoreCardCheckBoxHelperList[index].ScoreName)


        }

   </td>
 </tr>
</table>

这是我正在处理的视图模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using QQAForm.Models;

namespace QQAForm.ViewModels
{
public class AuditFormEdit
{
    public List<SubcategoryHelper> SubcategoryHelperGet { get; set; }

    public class SubcategoryHelper : Models.SubCategory
    {
        public SubcategoryHelper(Models.SubCategory subCat)
        {
            this.SubCategoryID = subCat.SubCategoryID;
            this.SubcategoryName = subCat.SubcategoryName;
        }

    }


    public Models.MainAnswer ScoreInstance { get; set; }

    public List<ScoreCardCheckBoxHelper> ScoreCardCheckBoxHelperList { get; set; }

    public void InitializeScoreCheckBoxHelperList(List<Models.Score> ScoreList)
    {
        if (this.ScoreCardCheckBoxHelperList == null)
            this.ScoreCardCheckBoxHelperList = new List<ScoreCardCheckBoxHelper>();

        if (ScoreList != null
            && this.ScoreInstance != null)
        {
            this.ScoreCardCheckBoxHelperList.Clear();
            ScoreCardCheckBoxHelper scoreCardCheckBoxHelper;
            string scoreTypes =
                string.IsNullOrEmpty(this.ScoreInstance.Score) ?
                string.Empty : this.ScoreInstance.Score;
            foreach (Models.Score scoreType in ScoreList)
            {
                scoreCardCheckBoxHelper = new ScoreCardCheckBoxHelper(scoreType);
                if (scoreTypes.Contains(scoreType.ScoreName))
                    scoreCardCheckBoxHelper.Checked = true;
                this.ScoreCardCheckBoxHelperList.Add(scoreCardCheckBoxHelper);
            }
        }
    }


    public void PopulateCheckBoxsToScores()
    {
        this.ScoreInstance.Score = string.Empty;
        var scoreType = this.ScoreCardCheckBoxHelperList.Where(x => x.Checked)
                              .Select<ScoreCardCheckBoxHelper, string>(x => x.ScoreName)
                              .AsEnumerable();
        this.ScoreInstance.Score = string.Join(", ", scoreType);
    }


    public class ScoreCardCheckBoxHelper : Models.Score
    {
        public bool Checked { get; set; }

        public ScoreCardCheckBoxHelper() : base() { }

        public ScoreCardCheckBoxHelper(Models.Score score)
        {
            this.ScoreID = score.ScoreID;
            this.ScoreName = score.ScoreName;
        }
    }



}
}

这是控制器部分:

    //get
    public ActionResult _Forms(int section)
    {
        AuditFormEdit viewModel = new AuditFormEdit();
        //viewModel.ScoreInstance = _db.MainAnswers.Single(r => r.MainAnswerID == id);
        _db.SubCategories.Single(r => r.SubCategoryID == section);
        viewModel.InitializeScoreCheckBoxHelperList(_db.Scores.ToList());
        return View(viewModel);
    }



    //post
    [HttpPost]
    public ActionResult _Forms(AuditFormEdit viewModel)
    {
        if (ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToScores();
            _db.Entry(viewModel.ScoreInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("/");
        }
        else
        {
            return View(viewModel);
        }
    }

因此,如果您查看布局,其中显示 _Forms 的位置,该部分应通过链接 /AuditSchedule/1132/1 更改 - 它没有。以及我目前没有显示的复选框。

4

1 回答 1

0

...我的复选框目前也没有显示。

这是因为viewModel.ScoreInstance在控制器的 GET 操作中设置的行被注释掉了:

//viewModel.ScoreInstance = _db.MainAnswers.Single(r => r.MainAnswerID == id);

因此viewModel.ScoreInstanceisnull并且在InitializeScoreCheckBoxHelperList你中填充ScoreCardCheckBoxHelperList唯一的 when viewModel.ScoreInstanceis not null

if (this.ScoreCardCheckBoxHelperList == null)
    this.ScoreCardCheckBoxHelperList = new List<ScoreCardCheckBoxHelper>();

if (ScoreList != null
    && this.ScoreInstance != null)
{
    //... add elements to ScoreCardCheckBoxHelperList
}

ScoreCardCheckBoxHelperList= 没有复选框。

于 2012-08-16T20:14:55.217 回答