2016-09-22 88 views
-1

我无法在编辑动作中检索到我的DropDownList控件的正确值。ASP.NET MVC使用DropDownList编辑ViewModel

客户型号:

public class Customer 
{ 
    public int CustId { get; set; } 
    public string CustDisplayName { get; set; } 
    public string CustFirstName { get; set; } 
    public string CustLastName { get; set; } 
    public string CustCompanyName { get; set; } 
    public string CustAddress { get; set; } 
    public string CustPhoneNumber { get; set; } 
    public string CustMobileNumber { get; set; } 
    public string CustEmailAddress { get; set; } 

    public int StId { get; set; } 
    public State State { get; set; } 
} 

状态模型:

public class State 
{ 
    public int StId { get; set; } 
    public string StAbbr { get; set; } 

    public List<Customer> Customers { get; set; } 
} 

制造商型号:

public class Manufacturer 
{ 
    public int MfrId { get; set; } 
    public string MfrCompanyName { get; set; } 
    public string MfrWebsiteDomainName { get; set; } 
} 

CustomerFormViewModel

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

    [Required(ErrorMessage = "Display Name is required!")] 
    [Display(Name = "Display Name")] 
    [StringLength(100)] 
    public string CustDisplayName { get; set; } 

    [Display(Name = "First Name")] 
    [StringLength(50)] 
    public string CustFirstName { get; set; } 

    [Display(Name = "Last Name")] 
    [StringLength(50)] 
    public string CustLastName { get; set; } 

    [Display(Name = "Company Name")] 
    [StringLength(50)] 
    public string CustCompanyName { get; set; } 

    [Display(Name = "Phone Number")] 
    [DataType(DataType.PhoneNumber)] 
    [StringLength(12)] 
    [RegularExpression(@"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}", ErrorMessage = "Invalid Phone Number format!")] 
    public string CustPhoneNumber { get; set; } 

    [Display(Name = "Mobile Number")] 
    [DataType(DataType.PhoneNumber)] 
    [StringLength(12)] 
    [RegularExpression(@"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}", ErrorMessage = "Invalid Number!")] 
    public string CustMobileNumber { get; set; } 

    [Display(Name = "Email Address")] 
    [DataType(DataType.EmailAddress)] 
    [StringLength(320)] 
    public string CustEmailAddress { get; set; } 

    [Required(ErrorMessage = "Address is required!")] 
    [Display(Name = "Address")] 
    [StringLength(100)] 
    public string CustAddress { get; set; } 

    [Required(ErrorMessage = "State is required!")] 
    [Display(Name = "State")] 
    public int StId { get; set; } 

    public IEnumerable<State> States { get; set; } 
} 

CustomerController:

public class CustomerController : Controller 
{ 
    private WebAppDbContext _context; 

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

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

    public ActionResult Create() 
    { 
     var states = _context.States.ToList(); 
     var viewModel = new CustomerFormViewModel 
     { 
      States = states 
     }; 

     return View(viewModel); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(CustomerFormViewModel vm) 
    { 
     if (ModelState.IsValid) 
     { 
      var customer = new Customer(); 
      { 
       customer.CustDisplayName = vm.CustDisplayName; 
       customer.CustFirstName = vm.CustFirstName; 
       customer.CustLastName = vm.CustLastName; 
       customer.CustCompanyName = vm.CustCompanyName; 
       customer.CustAddress = vm.CustAddress; 
       customer.CustPhoneNumber = vm.CustPhoneNumber; 
       customer.CustMobileNumber = vm.CustMobileNumber; 
       customer.CustEmailAddress = vm.CustEmailAddress; 
       customer.StId = vm.StId; 
      } 
      _context.Customers.Add(customer); 
      _context.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     else 
     { 
      vm.States = _context.States.ToList(); 
      return View(vm); 
     } 
    } 

    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return NotFound(); 
     } 

     var customervm = new CustomerFormViewModel(); 
     { 
      Customer customer = _context.Customers.SingleOrDefault(c => c.CustId == id); 
      if (customer == null) 
      { 
       return NotFound(); 
      } 

      customervm.CustId = customer.CustId; 
      customervm.CustDisplayName = customer.CustDisplayName; 
      customervm.CustFirstName = customer.CustFirstName; 
      customervm.CustLastName = customer.CustLastName; 
      customervm.CustCompanyName = customer.CustCompanyName; 
      customervm.CustAddress = customer.CustAddress; 
      customervm.CustPhoneNumber = customer.CustPhoneNumber; 
      customervm.CustMobileNumber = customer.CustMobileNumber; 
      customervm.CustEmailAddress = customer.CustEmailAddress; 
      customervm.StId = customer.StId; 
     } 
     return View(customervm); 
    } 
} 

创建视图:

<div class="form-group"> 
    @Html.LabelFor(c => c.CustDisplayName) 
    @Html.TextBoxFor(c => c.CustDisplayName, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustDisplayName) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustFirstName) 
    @Html.TextBoxFor(c => c.CustFirstName, new { @class = "form-control" }) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustLastName) 
    @Html.TextBoxFor(c => c.CustLastName, new { @class = "form-control" }) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustCompanyName) 
    @Html.TextBoxFor(c => c.CustCompanyName, new { @class = "form-control" }) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustAddress) 
    @Html.TextBoxFor(c => c.CustAddress, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustAddress) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustPhoneNumber) 
    @Html.TextBoxFor(c => c.CustPhoneNumber, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustPhoneNumber) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustMobileNumber) 
    @Html.TextBoxFor(c => c.CustMobileNumber, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustMobileNumber) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustEmailAddress) 
    @Html.TextBoxFor(c => c.CustEmailAddress, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustEmailAddress) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(s => s.StId) 
    @Html.DropDownListFor(s => s.StId, new SelectList(Model.States, "StId", "StAbbr"), "", new { @class = "form-control" }) 
    @Html.ValidationMessageFor(s => s.StId) 
</div> 

<div class="form-group"> 
    <button type="submit" class="btn btn-primary">Submit</button> 
</div> 

编辑观点:

<div class="form-group"> 
    @Html.LabelFor(c => c.CustDisplayName) 
    @Html.TextBoxFor(c => c.CustDisplayName, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustDisplayName) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustFirstName) 
    @Html.TextBoxFor(c => c.CustFirstName, new { @class = "form-control" }) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustLastName) 
    @Html.TextBoxFor(c => c.CustLastName, new { @class = "form-control" }) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustCompanyName) 
    @Html.TextBoxFor(c => c.CustCompanyName, new { @class = "form-control" }) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustAddress) 
    @Html.TextBoxFor(c => c.CustAddress, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustAddress) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustPhoneNumber) 
    @Html.TextBoxFor(c => c.CustPhoneNumber, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustPhoneNumber) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustMobileNumber) 
    @Html.TextBoxFor(c => c.CustMobileNumber, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustMobileNumber) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(c => c.CustEmailAddress) 
    @Html.TextBoxFor(c => c.CustEmailAddress, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(c => c.CustEmailAddress) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(s => s.StId) 
    @Html.DropDownListFor(s => s.StId, new SelectList(Model.States, "StId", "StAbbr"), "", new { @class = "form-control" }) 
    @Html.ValidationMessageFor(s => s.StId) 
</div> 

@Html.HiddenFor(c => c.CustId) 

<div class="form-group"> 
    <button type="submit" class="btn btn-primary">Update</button> 
</div> 

回答

1

它与您的创建操作相同,为所有状态加载集合属性(States),并为您的视图模型对象上的选定项目(StId)设置属性。

因此,将此代码添加到您的编辑GET操作方法。

var customervm = new CustomerFormViewModel(); 
{ 
    // Your existing code to map the entity property values goes here 
} 

//Load all the states 

var states = _context.States.ToList(); 
customervm.States = states; 

//Set the selected state 
customervm.StId = customer.StId; 

return View(); 
+0

谢谢Shyju,那工作! – Brian

+0

现在,我是否可以为我的Edit Post Action重用相同的'var customervm = new CustomerFormViewModel();'来实际保存更新,还是需要在Edit Post Action上创建另一个新的CustomerFormViewModel? – Brian

+0

取决于您的创建和编辑视图的相似程度。通常你可以使用相同的。在创建您的Id将为空(使其可以为空),并从编辑提交时,它将有一个有效的值。根据此值确定是创建新记录还是更新现有记录。您可以使用相同的HttpPost操作方法进行保存(创建和编辑) – Shyju