Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的视图没有返回下拉列表信息_C#_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

C# 我的视图没有返回下拉列表信息

C# 我的视图没有返回下拉列表信息,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在运行Visual studio 2012调试器,发现我的productViewModelList参数不包含我希望视图传递给[HTTPPOST]编辑操作的所有值。我不明白为什么。请参阅下面代码示例中的注释,了解插入断点并检查productViewModelList值的位置I productViewModelList具有以下值: BrandId=0, 品牌名称=6, BrandSelectListItem=null, ID=5, Name=拐杖, 价格=10.0 BrandID不正确,在我的D

我正在运行Visual studio 2012调试器,发现我的productViewModelList参数不包含我希望视图传递给[HTTPPOST]编辑操作的所有值。我不明白为什么。请参阅下面代码示例中的注释,了解插入断点并检查productViewModelList值的位置I

productViewModelList具有以下值:

BrandId=0, 品牌名称=6, BrandSelectListItem=null, ID=5, Name=拐杖, 价格=10.0

BrandID不正确,在我的DropDownList中的视图中,我指定了Catatonics Inc.,它的ID为6,我在数据库中验证了它。 BrandName显示的是BrandID中的6,BrandName应该是Catatonics Inc。 BrandSelectList项是SelectListItem类型的对象,它包含进入我视图中DropDownList项的值。DropDownList正确显示值,但当执行[httpPost]编辑操作时,BrandSelectList为空。我需要访问DropDownList的选定项。 所有其他值、ID、名称和价格都正确。 下面是我代码中的一些类

医疗产品控制器 医药产品 医学产品视图模型
BrandID没有表单元素,因此当模型绑定器将表单POST转换为模型时,它将使用int的默认值,即0。您确实有BrandName的表单元素:

这可能取决于BrandSelectListItem的定义,并根据您描述的观察行为,创建一个select元素,其中option元素使用可用的BrandName值作为文本,使用可用的BrandID值作为值。当HTTP POST中包含select元素时,所选值就是所发布的内容。因此,您将获得所选BrandID,但通过将其绑定到模型上的该属性,将其分配给BrandName的值

听起来你真正想要的是:

@Html.DropDownListFor(item => Model.BrandID, Model.BrandSelectListItem)
这将为您提供:

BrandId = 6, BrandName = "", BrandSelectListItem = null, ID = 5, Name = "Crutch", Price = 10.0
您仍然没有BrandName值,但在这种情况下您真的需要它吗?这是重复的数据。该模型可以根据已知的BrandID动态确定BrandName。因此BrandName不需要是模型上的读/写属性,它可以是一个只读属性,根据模型的BrandID获取BrandName。它可能很简单,比如:

public string BrandName
{
    get
    {
        var brandName = GetBrandName(BrandID);
        return brandName;
    }
}
在本例中,您将实现GetBrandName以从数据存储中获取值。或者,如果整件事足够清晰和简洁,那就由你决定。您还可以将该值缓存在类级私有变量中,以便只需获取一次。只要确保清除该变量,或者在BrandID更改时重新获取它


您可以保持这两个属性的原样,但随后您将负责确保它们在对象的生命周期(包括它在UI中花费的时间)内保持同步。每当您在两个地方记录同一条信息时,您都有责任保持同步。这一点都不好玩。在这种情况下,视图中需要两个元素,第二个元素可以是隐藏的表单字段,或者是一个样式为隐藏的下拉列表,您必须编写一些JavaScript,以便在另一个发生更改时对其进行更新。

可能是您的参数名称与发送到服务器的内容不匹配。我在编辑中向我的问题添加了一些模型类,如果这样做可以清除任何内容。@ArmorCode:这不会改变表单没有名为的元素的事实因此,BrandID和没有一个值可提供给视图模型中的BrandID属性。我对如何实现GetBrandName函数从数据存储中获取BrandName有点困惑。我的理解是模型类中应该只有属性,而没有方法。@ArmorCode:这种理解根本不正确。模型应该尽可能多地封装系统的逻辑和行为。虽然在本例中,您真正添加的只是一个只读属性,它在内部从数据存储中获取数据。它不需要在一个单独的方法中,这只是为了一个例子。@ArmorCode:如果DbContext没有被抽象到任何存储库或工厂或类似的东西后面,那么我想是的。从逻辑上讲,我认为MedicalProduct对象将具有品牌属性。该属性可以以多种方式填充。MedicalProduct的构造器可能需要一个BrandID并在内部将其转换为一个品牌,或者只是将其存储在一个私有字段中,并在第一次访问品牌属性时根据该标识符获取一个品牌。或者可能有一个公开的BrandID属性而不是构造函数参数。
@model MvcMedicalStore.Models.MedicalProductViewModel

@Html.HiddenFor(item => Model.ID)

<div class="editor-label">
    @Html.LabelFor(item => Model.Name)
</div>
<div class="editor-field">
    @Html.EditorFor(item => Model.Name)
    @Html.ValidationMessageFor(item => Model.Name)
</div>

<div class="editor-label">
    @Html.LabelFor(item => Model.Price)
</div>
<div class="editor-field">
    @Html.EditorFor(item => Model.Price)
    @Html.ValidationMessageFor(item => Model.Price)
</div>

<div class="editor-label">
    @Html.LabelFor(item => Model.BrandName)
</div>
<div class="editor-field">
    @Html.DropDownListFor(item => Model.BrandName, Model.BrandSelectListItem)
    @Html.ValidationMessageFor(item => Model.BrandName)
</div>
public class Brand
{
    [Key]
    public int ID { get; set; }

    [Required]
    [StringLength(30)]
    public string Name { get; set; }
}
public class MedicalProduct
{
    [Key]
    public int ID { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.Currency)]
    public double Price { get; set; }

    // is a foreign key
    public int BrandID { get; set; }
}
public class MedicalProductViewModel
{
    [Key]
    public int ID { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.Currency)]
    public double Price { get; set; }

    public int BrandID { get; set; }

    [DisplayFormat(NullDisplayText="[Generic]")]
    public string BrandName { get; set; }

    public IEnumerable<SelectListItem> BrandSelectListItem { get; set; }
}
@Html.DropDownListFor(item => Model.BrandName, Model.BrandSelectListItem)
@Html.DropDownListFor(item => Model.BrandID, Model.BrandSelectListItem)
BrandId = 6, BrandName = "", BrandSelectListItem = null, ID = 5, Name = "Crutch", Price = 10.0
public string BrandName
{
    get
    {
        var brandName = GetBrandName(BrandID);
        return brandName;
    }
}