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

C# 将数据库值设置为对象的属性值,c#,asp.net-mvc,database,entity-framework,properties,C#,Asp.net Mvc,Database,Entity Framework,Properties,我试图在数据库中创建一个新对象,该对象将根据DropDownList的选择获取数据库条目的值 在下面的示例中,我需要一个新的“Domena”对象来保存属于TLD类的属性“Cena”的值,属性“Cena”已经创建,并且作为十进制值存在于数据库中。当从下拉列表中选择给定的TLD时,它应该从TLD类中获取“Cena”的值 以下是Domena类模型: public class Domena { public int DomenaID { get; set; } public int TLDID { ge

我试图在数据库中创建一个新对象,该对象将根据DropDownList的选择获取数据库条目的值

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

以下是Domena类模型:

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; }
}
但该值仍然是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>
应该是

model.TldList = new SelectList(db.TLDs, "TLDID", "Typ");
根据您在CreateViewModel中输入的内容:

public IEnumerable<SelectListItem> TldList {get; set;}
public IEnumerable TldList{get;set;}
我说得对吗

但是,当我尝试此操作时,我收到一条错误消息,消息说:

无法将类型“System.Web.Mvc.SelectList”隐式转换为IEnumerable。存在显式转换。你缺演员吗

也许更多地解释一下我想要实现的目标:

我有一个创建Domena对象的页面。对于TLD.Typ列出的db.TLD中的TLD列表,有一个DropDownList。我想让我的httpGet/httpPost方法知道,如果选择了TLDID=1(从DropDownList中显示TLD.Typ值),那么它应该将属于TLDID=1的“Cena”值分配给Domena.Cena属性


希望这能更好地解释它。

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

基本上,一旦获得用户选择的TLD ID,就需要从上下文中获取TLD实体,并且该TLD实体持有您想要填充新Domena对象属性的Cena值。我不确定是否/在何处将Cena值放在屏幕上,但您可以将其作为
DomenaViewModel
的属性,并在将新的
Domena
保存到DB后在POST操作中进行设置

假设Domena类是一个实体,使用实体作为视图模型并不是很好,这里已经讨论过很多次了。通常的方法似乎是使用
DomenaViewModel
类或
domenado
类作为视图模型。然后根据需要在视图模型和实体之间映射适当的字段
AutoMapper
是帮助自动化和组织此过程的常用选项;我使用的是
valueinjector。
在这个特定的示例中,手动操作应该非常简单,足以说明这一点

另一件事是,
ViewBag
用于
选择列表
,但
视图
中从未引用
ViewBag
。在这里,我将不再使用
ViewBag
,而是坚持使用
ViewModel
方法。我将保持简单,重点关注TLD和Domena类,以及创建操作所需的内容。其他下拉列表和实体也将采用类似的方法

请注意,您希望注意不要向数据库添加另一个与已存在的数据库完全相同的
Domena
(具有所有相同的外键和值),除非您特别希望这样做。基于Scott Allen的下拉式方法

公共类DomenaViewModel
{
公共列表TLD{get;set;}
public int selectedtlid{get;set;}
公共IEnumerable数据项
{
获取{returnnewselectlist(Tlds,“TLDID”,“Typ”);}
}
//忽略无关代码
}
[HttpGet]
公共操作结果创建()
{
var模型=新的DomenaViewModel
{
Tlds=db.Tlds.ToList();
};
返回视图(模型);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共操作结果创建(DomenaViewModel viewModel)
{
if(ModelState.IsValid)
{
var tld=db.TLDs.Find(model.selectedtlid);//假设您使用的是DbContext
如果(tld!=null)
{
//映射最好使用另一种方法,但现在我们将在这里进行
var newDomena=新Domena
{
TLD=TLD,
Cena=tld.Cena
}
db.Domeny.Add(newDomena);
db.SaveChanges();
}
返回操作(“索引”);
}
viewModel.Tlds=db.Tlds.ToList();
返回视图(viewModel);
}
该观点的相关部分:

@model DomenaViewModel

<div class="editor-field">
    @Html.DropDownListFor(m => m.SelectedTldId, Model.TldItems)
</div>
@model-DomenaViewModel
@DropDownListFor(m=>m.selectedtlid,Model.TldItems)

Hi@bcr。谢谢你的帮助。我用更多的解释和数据编辑了我的文章。希望你能快速看一看!你好@bcr。谢谢你。我花了一段时间才让它与3个不同的dropdownlist和另外15个不同的属性一起工作,但这确实有效,所有内容都正确地保存在我的数据库中。我唯一需要更改的是将public List更改为public IQueryable,因为在构建时出现了转换错误。我想问一下您对“注意,您希望注意不要向DB添加另一个与已存在的Domena完全相同的Domena”的看法。你能告诉我怎样才能最好地做到这一点吗?嗨,艾比,很高兴我能帮上忙。检索
tld
时,我编辑了呼叫
ToList()
的答案。我建议这样做,并在视图模型中的属性上返回
列表
类型。这样就可以立即执行查询并返回l
public IEnumerable<SelectListItem> TldList {get; set;}
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>