2015-06-06 2 views
1

Я новичок в MVC. Теперь я пытаюсь с простой демонстрацией MVC, чтобы распечатать информацию Клиента, чтобы отобразить и обновить его, отправить обратно в базу данных.Свойство модели становится нулевым при публикации

Я понятия не имею, почему Идентификатор Клиента становится нулевым, а остальные - точными.

Я хочу отобразить идентификатор клиента на экране, но я не хочу, чтобы пользователь редактировал его для публикации в моей базе данных. Я исследовал это в течение нескольких часов теперь ..

мой код:

Customer.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace PeopleManagement.Models 
{ 
    public class Customer 
    { 
     [Required] 
     public string Id { get; set; } 

     public string Name { get; set; } 

     public int Age { get; set; } 

     public Customer() 
     { 

     } 
     public Customer(string id, string name, int age) 
     { 
      Id = id; 
      this.Name = name; 
      this.Age = age; 
     } 
    } 
} 

Index.cshtml

@using System.Web.UI.WebControls 
@using PeopleManagement.Models 
@model IList<Customer> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>First MVC Application</title> 
     <link href="@Url.Content("~/Content/css/customized-table.css")" rel="stylesheet" type="text/css" /> 
    </head> 

    <body style="max-width:100%; max-height:100%"> 

     <div id="pageTitle" style="text-align:center; color:red; font-size:24px; font-weight:bold;">Customer Management</div> 
     @using (@Html.BeginForm("Index", "Home", FormMethod.Post)) 
     { 
      <div id="tablePanel" style="padding-top: 15px"> 

       <table class="customized_table" border="1"> 
        <tr> 
         <th>ID</th> 
         <th>Name</th> 
         <th>Age</th> 
        </tr> 

        @{ 
         for (var i = 0; i < Model.Count; i++) 
         { 
          <tr> 
           <td> 
            @Html.HiddenFor(model => model[i].Name); 
           </td> 
           <td> 
            @Html.TextBoxFor(model => model[i].Name, new {@style = "min-width:100%; text-align:center", @disable = "true"}) 
           </td> 
           <td> 
            @Html.TextBoxFor(model => model[i].Age) 
           </td> 
          </tr> 
         } 
        } 
       </table> 

      </div> 

      <div> 
       <p><input type="submit"/></p> 
      </div> 

     } 

    </body> 

</html> 

<script> 

</script> 

HomeController. cs

using System.Collections.Generic; 
using System.Web.Mvc; 
using PeopleManagement.Models; 

namespace PeopleManagement.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public List<Customer> CustomersList { get; private set; } = new List<Customer>(5); 

     [HttpGet] 
     public ActionResult Index() 
     { 
      CustomersList.Add(new Customer("ID_1", "Name_1", 1)); 
      CustomersList.Add(new Customer("ID_2", "Name_2", 2)); 
      CustomersList.Add(new Customer("ID_3", "Name_3", 3)); 

      ModelState.Clear(); 
      return View(CustomersList); 
     } 

     [HttpPost] 
     public ActionResult Index(List<Customer> postbackCustomers) 
     { 
      if (!ModelState.IsValid) 
       return View(CustomersList); 

      CustomersList = postbackCustomers; 

      return View(CustomersList); 
     } 
    } 
} 

Может ли кто-нибудь помочь?

+0

Помимо включения скрытого ввода, как указано в ответах ниже (1) У вас не должно быть как скрытого ввода, так и текстового поля для свойства 'Name'. Я предполагаю, что вы пытаетесь отключить текстовое поле, которое '@disable =" true "' не будет делать (его 'disabled =" disabled "'), но просто сделайте его 'readonly =" readonly "и удалите скрытый ввод. (2) 'ModelState.Clear();' бессмысленно - ничто не было добавлено в 'ModelState' в вашем методе GET. (3) 'return View (CustomersList);' не имеет смысла - зачем вам возвращать пустой список, если модель недействительна. –

ответ

1

В MVC, если вы хотите получить какое-то значение из вида, вы должны сначала иметь это значение в представлении. Кажется, вы не указали Id в представлении.

Изменения вида подобный кода

for (var i = 0; i < Model.Count; i++) 
      { 
       <tr> 
        <td> 
         @Html.HiddenFor(model => model[i].Id) 
        </td> 
        <td> 
         @Html.TextBoxFor(model => model[i].Name, new { @style = "min-width:100%; text-align:center", @disable = "true" }) 
        </td> 
        <td> 
         @Html.TextBoxFor(model => model[i].Age) 
        </td> 
       </tr> 
      } 

Надеется, что это помогает !!

0

Фактически вы не показываете идентификатор в представлении index.html, идентификатор клиента имеет значение в вашем примере. Вы должны попытаться показать его в режиме только для чтения в каждом цикле.

@Html.DisplayFor(model => model[i].Id) 
+0

Как защитить m ID, когда я использовал @ Html.DisplayFor? Потому что теперь я могу изменить данные отправки, используя отладчик браузера. ? – Redplane

Смежные вопросы