将数据库值设置为对象的属性值

本文关键字:属性 对象 设置 数据库 | 更新日期: 2023-09-27 18:13:25

我正在尝试在数据库中创建一个新对象,该对象将根据选择的下拉列表获取数据库条目的值。

在下面的例子中,我想要一个新的"Domena"对象来保存属性"Cena"的值,它属于类TLD,属性"Cena"已经创建,它在数据库中作为十进制值。当给定的TLD已经从下拉列表中选择时,它应该从TLD类中获取"Cena"的值。

这是Domena Class模型:

public class Domena
{
public int DomenaID { get; set; }
public int TLDID { get; set; } // foreign id
public int KlientID { get; set; }
// irrelevant code omitted
public decimal Cena { get; set; } // value which should be copied from "Cena" from TLD CLASS
public virtual TLD TLD { get; set; }
public virtual Klient Klient { get; set; }  

}

TLD类:

public class TLD
{
public int TLDID { get; set; }
public string Typ { get; set; }
public decimal Cena { get; set; }
public virtual ICollection<Domena> Domeny { get; set; }
}

我一直在看:http://blogs.msdn.com/b/adonet/archive/2011/01/30/using-dbcontext-in-ef-feature-ctp5-part-5-working-with-property-values.aspx但我无法为自己找到解决办法。我已经尝试过在我的HTTP GET创建操作中的代码:

    public ActionResult Create(TLD cena)
    {
        ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ");
        ViewBag.KlientID = new SelectList(db.Klienci, "KlientID", "Firma");
           var model = new Domena
            {
                Cena = cena.Cena
            };
        return View();
    }

但是Value仍然是0.00。我不知道如何完成这件事。

非常欢迎任何帮助。


在bcr回答后编辑:

对不起,我没有把需要的数据都放进去。我实际上已经修改了httpget和httpPost方法,因为我添加了另一个下拉菜单。如下:

HTTPGET:

    public ActionResult Create()
    {
        ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ");
        ViewBag.KlientID = new SelectList(db.Klienci, "KlientID", "Firma");
        ViewBag.StatusID = new SelectList(db.StatusDomeny, "StatusID", "Status");
        return View();
    }

HTTPPOST:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Domena domena)
    {
        if (ModelState.IsValid)
        {
            db.Domeny.Add(domena);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ", domena.TLDID);
        ViewBag.KlientID = new SelectList(db.Klienci, "KlientID", "Firma", domena.KlientID);
        ViewBag.StatusID = new SelectList(db.StatusDomeny, "StatusID", "Status", domena.StatusID);
        return View(domena);
    }

我的视图是这样的:

    <div class="editor-label">
        @Html.LabelFor(model => model.TLDID, "TLD")
    </div>
    <div class="editor-field">
        @Html.DropDownList("TLDID", String.Empty)
        @Html.ValidationMessageFor(model => model.TLDID)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.KlientID, "Klient")
    </div>
    <div class="editor-field">
        @Html.DropDownList("KlientID", String.Empty)
        @Html.ValidationMessageFor(model => model.KlientID)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.StatusID, "Status")
    </div>
    <div class="editor-field">
        @Html.DropDownList("StatusID", String.Empty)
        @Html.ValidationMessageFor(model => model.StatusID)
    </div>

到目前为止,正如你所看到的,我已经删除了所有与"Cena"相关的内容,因为我无法让它工作。

正如我在httpGet方法中的理解:

model.TldDropDown = new SelectList(db.TLDs, "TLDID", "Typ");

应为

model.TldList = new SelectList(db.TLDs, "TLDID", "Typ");

基于您在CreateViewModel中放置的内容:

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

我说的对吗?

然而,当我尝试这个,我得到一个错误消息说:

不能隐式转换类型"System.Web.Mvc"。选择"列表"到"枚举"。存在显式转换。你是不是缺石膏了?

也许更多的解释我想要达到的目标:

我有一个创建页面的Domena对象。有一个下拉列表列表的顶级域名从数据库。按tld . type列出的tld。我想我的httpGet/httpPost方法知道,如果让我们说TLDID = 1(它显示TLD。从下拉列表中选择类型值,然后它应该分配属于TLDID = 1的"Cena"值给Domena。希纳财产。

将数据库值设置为对象的属性值

谢谢你的澄清,这很有帮助。那么您的视图绑定到Domena实体作为其模型吗?这不在你的视图示例中,但我假设有。

基本上,一旦您获得了用户选择的TLD ID,您将需要从上下文中获得TLD实体,并且该TLD实体包含您想要填充新Domena对象属性的Cena值。我不确定是否/在哪里你想把Cena值在屏幕上,但你可以把它作为DomenaViewModel的属性,并在POST动作中设置它,在你保存了新的Domena到DB后。

假设Domena类是一个实体,使用实体作为视图模型并不是很好,正如这里多次讨论的那样。一般的方法似乎是有像DomenaViewModel类或DomenaDto类的东西作为视图模型使用。然后根据需要在视图模型和实体之间映射适当的字段。AutoMapper是一个流行的选项,可以帮助自动化和组织这个过程;在这个特殊的例子中,手动操作应该足够简单,可以说明这一点。

另一件事是ViewBag用于SelectLists,但ViewBag从未在View中被引用。在这里,我将完全放弃使用ViewBag,并坚持使用ViewModel方法。我将保持简单,专注于TLD和Domena类,以及Create操作所需的内容。其他下拉菜单和实体也将使用类似的方法。

请注意,除非您特别想要这样做,否则您要注意不要向DB添加另一个与已经存在的Domena完全相同的CC_15(具有所有相同的外键和值)。基于Scott Allen的文章的下拉式方法。

public class DomenaViewModel
{
    public List<TLD> Tlds {get; set;} 
    public int SelectedTldId { get; set; }
    public IEnumerable<SelectListItem> TldItems
    {
        get { return new SelectList(Tlds, "TLDID", "Typ"); }
    }
    // irrelevant code omitted
}
[HttpGet]
public ActionResult Create()
{
    var model = new DomenaViewModel
      {
          Tlds = db.TLDs.ToList();
      };
    return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(DomenaViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        var tld = db.TLDs.Find(model.SelectedTldId); // assuming you're using DbContext
        if (tld != null)
        {
            // the mapping is best served in a different method, but we'll do it here for now
            var newDomena = new Domena
              {
                  TLD = tld,
                  Cena = tld.Cena
              }
            db.Domeny.Add(newDomena);
            db.SaveChanges();
        }
        return RedirectToAction("Index");
    }
    viewModel.Tlds = db.TLDs.ToList();
    return View(viewModel);
}

视图的相关部分:

@model DomenaViewModel
<div class="editor-field">
    @Html.DropDownListFor(m => m.SelectedTldId, Model.TldItems)
</div>
相关文章: