【问题标题】:HTML.DropDownListFor DropDownListHTML.DropDownListFor DropDownList
【发布时间】:2016-08-30 20:00:17
【问题描述】:

我正在尝试将数据从我的数据库检索到 HTML,而不是检索到 Html.DropDownListFor,但我无法检索到标记。

NewCustomerViewModel

    public class NewCustomerViewModel
{
    public int CustId { get; set; }

    [Required]
    public string CustFirstName { get; set; }

    [Required]
    public string CustLastName { get; set; }

    [Required]
    public int StId { get; set; }
    public IEnumerable<State> States { get; set; }
}

客户控制器

public class CustomerController : Controller
{
    private CustomerDbContext _context;

    public CustomerController(CustomerDbContext context)
    {
        _context = context;
    }

    // GET: /<controller>/
    public IActionResult Index()
    {
        return View(_context.Customers.ToList());
    }

    public IActionResult Create()
    {
        var stateNames = _context.States.ToList();
        var viewModel = new NewCustomerViewModel
        {
            States = stateNames
        };

        return View(viewModel);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Create(Customer customer)
    {
        if (ModelState.IsValid)
        {
            _context.Customers.Add(customer);
            _context.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(customer);
    }
}

创建视图

下面的 HTML DropDownListFor 工作正常:

@Html.DropDownListFor(m => m.StId, new SelectList(Model.States, "StId", "StName"))

我无法让选择标签工作。

<select asp-for="StId" asp-items="@Model.States" class="form-control">
            <option>Select State</option>
        </select>

我在 Create 视图中的所有 HTML 都使用而不是我试图避免的 HTML Helpers。我只是希望能够将数据检索到标签中。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core-mvc tag-helpers


    【解决方案1】:

    对于选择标签助手,asp-items 需要 SelectListItem 集合\SelectList,其中的每个项目都有一个 ValueText 属性。 Value 属性值将用于选项的值,Text 属性值将用于 UI 中选项的显示文本。

    States 集合中的项目没有 Value 和 Text 属性,但具有 StIdStName 属性。所以我们需要将此类型转换为 SelectListItem 类型。

    所以你的代码应该是

    <select asp-for="StId"  asp-items="@(new SelectList(Model.States,"StId","StName"))">
         <option>Please select one</option>
    </select>
    

    补充参考

    Select Tag Helper in MVC 6

    【讨论】:

    • 谢谢!!那行得通。我有几个问题,“@”符号有什么作用?为什么需要它?
    • 以这种方式而不是其他方式在我的控制器中检索我的 DropDownList 的值和 ID 数据会更好吗?如果是这样,我需要向 Create Action Method 和 SelectTag Helper 添加什么? private IEnumerable&lt;SelectListItem&gt; GetStateList() { var ste = _context.State .Select(s =&gt; new SelectListItem { Value = s.StId.ToString(), Text = s.StName }) .ToList(); return (ste); }
    • 你需要@,因为我们想要执行一些C#代码(创建新的SelectList对象)。我个人更喜欢在视图中保留更少的 C# 代码。请参阅我发布的链接,它有不同的方法。我更喜欢 C# 代码较少的那个(视图中没有 new SelectList
    • 好的,因为我已经使用 select tag helper 或 html.dropdown 实现了 ViewModel 和 DropDownList,因为当我尝试执行 Create Action Method 时,我不断收到错误消息。 错误: ArgumentNullException:值不能为空。参数名称:项目&lt;select asp-for="StId" asp-items="@(new SelectList(Model.States,"StId","StAbbr"))"&gt;
    • 在您的 GET 操作中?你确定Model.States 是一个有效的集合吗? (非空)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多