0

我正在进行的项目要求我在表单上放置复选框,以便用户可能选择多个项目。我可以将这些作为布尔值放在单独的列中,但复选框值可能会更改或需要添加。所以我创建了一个包含这些复选框名称的表格,然后将它们列出来。我的问题是;我如何将这些值放入与客户一致的另一个表中。这应该如何正确处理?

该视图具有公司名称和记录 ID /AuditSchedule/details/208 我已经读到在列中放置多个值不是一个好习惯,但我还有什么其他选择?

非常感谢!

我为客户表提供的是 ProductType 字段。这与任何事情无关。还有另一个包含产品类型的表格,我想将其列为复选框。我在这两个表之间没有任何关系。对我来说似乎不应该有,但请纠正我,让我知道是否应该有。So when a check box is selected i want that value (ProductName) to be put in the customer table in the ProductType field separated with commas.

这是客户或计划表:

    public class AuditSchedule
{
    public virtual int AuditScheduleID { get; set; }
    public virtual Nullable<DateTime> audit_completed_date { get; set; }
    public virtual string gl_cmp_key { get; set; }
    public virtual string audit_year { get; set; }
    public virtual string ar_ship_key { get; set; }
    public virtual string ar_ship_name { get; set; }
    public virtual string im_adres_city { get; set; }
    public virtual string im_adres_state { get; set; }
    public virtual string audit_type { get; set; }
    public virtual string audit_no { get; set; }
    public virtual string audit_group { get; set; }
    public virtual string Footage { get; set; }
    public virtual string Rolling3MosFootage { get; set; }
    public virtual string snp_SalesRep8 { get; set; }
    public virtual string epg_sales_rep_accountable { get; set; }
    public virtual string tech_service_rep { get; set; }
    public virtual string audit_done_by { get; set; }
    public virtual Nullable<DateTime> audit_recieved_date { get; set; }
    public virtual string audit_notes { get; set; }
    public virtual string audit_pdf { get; set; }
    public virtual string updated { get; set; }
    public virtual string hidden { get; set; }
    public virtual string en_stats_key { get; set; }
    public virtual string Control_ID { get; set; }
    public virtual Nullable<DateTime> audit_date { get; set; }
    public virtual string contacts_present { get; set; }
    public virtual string audit_furnished_to { get; set; }
    public virtual string spacer_type { get; set; }
}

这是产品表:

    public class SpacerProduct
{
    public int SpacerProductID { get; set; }
    public string SpacerBrand { get; set; }
    public string SpacerName { get; set; }
}

希望这可以帮助

该视图是 AuditSchedules 的表单类型编辑,只有几个地方需要填写。这部分有效。将复选框添加到视图是我迷路的地方。我创建了一个填充复选框的 ToList 的局部视图,然后将其添加到表单中。不知道如何得到表中的结果。

Tohid 的问题:我对一些事情有疑问。首先是 ViewModel,我假设这只是你的 Models 目录的命名空间,而我的只是 Models。_db.getAuditScheduleById 不在我的实体中,您解释说我可能必须采取另一种方式。对我来说它将是 _db.AuditSchedules 它出现在下拉列表中但不喜欢它所以我将其更改为更新 07/02/2012 viewModel.AuditScheduleInstance = _db.AuditSchedules.Single(r => r.AuditScheduleID == id) ;

我仍然有一个问题

_db.GetAvailableSpacerProducts()

我的实体中没有任何反映这一点的东西,我不知道如何改变它。可能类似于我在另一个中所做的更改,但不确定。

2012 年 7 月 5 日更新

这是QQAEntities:

命名空间 QQAForm.Models

{
public class QQAEntities : DbContext
   {
    public DbSet<AuditSchedule> AuditSchedules { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<SubCategory> SubCategories { get; set; }
    public DbSet<MainQuestion> MainQuestions { get; set; }
    public DbSet<Suggestion> Suggestions { get; set; }        
    public DbSet<DocumentLink> DocumentLinks { get; set; }
    public DbSet<Audit> Audits { get; set; }
    public DbSet<AuditData> AuditDatas { get; set; }
    public DbSet<SpacerProduct> SpacerProducts { get; set; }
    public DbSet<ScoreCard> ScoreCards { get; set; }



   }
}

我的解决方案中还有另一个名为 QQAForm.Data 的项目,它仅控制与成员资格相关的所有内容的角色和安全性。希望这可以帮助。感谢您的时间和耐心。

2012 年 7 月 6 日更新

最终工作编辑:

    [HttpPost]
    public ActionResult Edit(AuditScheduleEdit viewModel)
    {            
        if (ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToSpacerType();
            _db.Entry(viewModel.AuditScheduleInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        else
        {
            return View(viewModel);
        }

    }

2012 年 8 月 2 日更新

我已经决定我可以在这个项目的其他领域使用它。我有多个使用复选框的地方。

我试图在另一个视图上实现它,但它不起作用。它不起作用的原因是因为为了填充复选框,它会查看当前表中的 ID,以便可以更新它。这是片段:

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

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

(r => r.MainAnswerID == id) 是问题所在。MainAnswer 是需要更新的表。该记录还应插入 AuditScheduleID、MainQuestionID 和从 Score 复选框填充的文本。如果我对此发表评论,我将一无所获。我真正需要的是一种方法来接受这个并用数据插入一条新记录。不知道如何更改代码来执行此操作。

4

2 回答 2

1

如果我理解正确,您是在说:

  1. Customer有一个string名为ProductType的属性,其中包含以逗号分隔的ProductType名称字符串。
  2. ProductType有一个string属性ProductName
  3. 在视图中,任何ProductType都显示为复选框,并且可以为每个客户选择/取消选择。

正确的?对我来说,这看起来像是多对多的关系

您是否阅读过 MVC 教程的这一章:使用 MVC 开始使用 EF?特别是这部分:为 ASP.NET MVC 应用程序创建更复杂的数据模型

对我来说,如果您将Customer.ProductTypefrom类型更改stringList<ProductType>它可以解决所有问题。

但是,通过保持Customer.ProductTypeas string,它仍然可以解决。

代码

根据AuditScheduleSpacerProduct类(模型),我开发了一个新的 VeiwModel 类。将 ViewModel 视为一个容器,它打包其他类并准备好将它们发送到 View。

namespace MvcApplication1.ViewModels
{
    public class AuditScheduleEdit
    {
        public Models.AuditSchedule AuditScheduleInstance { get; set; }

        public List<SpacerProductCheckBoxHelper> SpacerProductCheckBoxHelperList { get; set; }

        public void InitializeSpacerProductCheckBoxHelperList(List<Models.SpacerProduct> SpacerProductList)
        {
            if (this.SpacerProductCheckBoxHelperList == null)
                this.SpacerProductCheckBoxHelperList = new List<SpacerProductCheckBoxHelper>();

            if (SpacerProductList != null
                && this.AuditScheduleInstance != null)
            {
                this.SpacerProductCheckBoxHelperList.Clear();
                SpacerProductCheckBoxHelper spacerProductCheckBoxHelper;
                string spacerTypes =
                    string.IsNullOrEmpty(this.AuditScheduleInstance.spacer_type) ?
                    string.Empty : this.AuditScheduleInstance.spacer_type;
                foreach (Models.SpacerProduct spacerProduct in SpacerProductList)
                {
                    spacerProductCheckBoxHelper = new SpacerProductCheckBoxHelper(spacerProduct);
                    if (spacerTypes.Contains(spacerProduct.SpacerName))
                        spacerProductCheckBoxHelper.Checked = true;
                    this.SpacerProductCheckBoxHelperList.Add(spacerProductCheckBoxHelper);
                }
            }
        }

        public void PopulateCheckBoxsToSpacerType()
        {
            this.AuditScheduleInstance.spacer_type = string.Empty;
            var spacerTypes = this.SpacerProductCheckBoxHelperList.Where(x => x.Checked)
                                  .Select<SpacerProductCheckBoxHelper, string>(x => x.SpacerName)
                                  .AsEnumerable();
            this.AuditScheduleInstance.spacer_type = string.Join(", ", spacerTypes);
        }

        public class SpacerProductCheckBoxHelper : Models.SpacerProduct
        {
            public bool Checked { get; set; }

            public SpacerProductCheckBoxHelper() : base() { }

            public SpacerProductCheckBoxHelper(Models.SpacerProduct spacerProduct)
            {
                this.SpacerProductID = spacerProduct.SpacerProductID;
                this.SpacerName = spacerProduct.SpacerName;
                this.SpacerBrand = spacerProduct.SpacerBrand;
            }
        }
    }
}

所以这里是相关控制器的编辑方法:

    public ActionResult Edit(int id)
    {
        AuditScheduleEdit viewModel = new AuditScheduleEdit();
        viewModel.AuditScheduleInstance = _db.GetAuditScheduleById(id);
        viewModel.InitializeSpacerProductCheckBoxHelperList(_db.GetAvailableSpacerProducts());
        return View(viewModel);
    }

    [HttpPost]
    public ActionResult Edit(AuditScheduleEdit viewModel)
    {
        if(ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToSpacerType();
            // TODO: Add update logic here
            return RedirectToAction("Index");
        }
        else
        {
            return View(viewModel);
        }
    }

在第一个 Action (HttpGET) 中,我简单地构造 的实例,然后从我的数据库中AuditScheduleEdit分配请求( )(您可能有不同的方式从存储库中查询数据)。AuditSchedule_db.GetAuditScheduleById(id)

然后必须将一个集合SpacerProducts传递给InitializeSpacerProductCheckBoxHelperList()函数(对不起,因为名字很长,试图清晰易懂!)。此函数创建一个列表,SpacerProductCheckBoxHelper用于在视图上生成复选框。

当用户提交表单时,AuditScheduleEdit重新创建(基于表单数据)并将被发送到第二个编辑操作(HttpPost)。在那里,PopulateCheckBoxsToSpacerType()将选中的复选框列表转换为逗号分隔的字符串并将其分配给AuditSchedule.spacer_type

这是视图:

@model MvcApplication1.ViewModels.AuditScheduleEdit
@using (Html.BeginForm())
{
    <div>
        <h3>Audi Schedule</h3>
        @Html.LabelFor(m => m.AuditScheduleInstance.AuditScheduleID)
        @Html.DisplayFor(m => m.AuditScheduleInstance.AuditScheduleID)
        @Html.HiddenFor(m => m.AuditScheduleInstance.AuditScheduleID)
        <br />
        @Html.LabelFor(m => m.AuditScheduleInstance.Control_ID)
        @Html.EditorFor(m => m.AuditScheduleInstance.Control_ID)
        // Here, add any field of AuditSchedule which needs to show on edit form 
        //       like what I did for AuditScheduleID and Control_ID.
        <h3>SpacerType</h3>
        @for (int index = 0; index < Model.SpacerProductCheckBoxHelperList.Count; index++)
        {
            @Html.CheckBoxFor(m => m.SpacerProductCheckBoxHelperList[index].Checked)
            @Html.LabelFor(m => m.SpacerProductCheckBoxHelperList[index], Model.SpacerProductCheckBoxHelperList[index].SpacerName)
            @Html.HiddenFor(m => m.SpacerProductCheckBoxHelperList[index].SpacerProductID)
            @Html.HiddenFor(m => m.SpacerProductCheckBoxHelperList[index].SpacerName)
            <br />
        }
    </div>
    <div>
        <input type="submit" value="Save" />
    </div>
}

我在 Visual Studio developer 2010 Exp 中编写了这段代码,它运行良好。您可以从这里下载此代码

于 2012-06-30T13:26:20.923 回答
0

我不清楚您提出的问题,但我假设当复选框值存储在您创建的表中时,您需要更新表(视图)中的记录。我认为不需要更新表,您只需要在两个表之间创建一个关系,然后您就可以在内部查询和连接的帮助下获取所有日期。

但是,如果您需要更新您的表格,您可以在您创建的表格中使用“插入后”触发器。如果您也可以共享表结构,那将非常有帮助。

您需要再创建一个表(以存储 itemselected 和正在选择它的客户的关系)与列(AuditScheduleID int,SpacerType int)该表应该在列上都有复合键,并且 1)列 AuditScheduleID 应该有外部与 Customer 表的键关系 2) 列 SpacerType 应该与 Product 表具有外键关系。3)当客户选择多个产品并提交时,每个产品的信息和 AuditScheduleID 应保存为上面创建的表格中的不同行。

现在您可以通过完全标准化以这种方式存储数据

于 2012-06-30T04:17:27.283 回答