Modèle d'affichage affichage de la valeur null propriétés au contrôleur

Sur ma page Index, j'ai un formulaire de recherche qui permet aux utilisateurs d'extraire des informations sur la base de 3 critères de recherche. Lorsque les résultats de la recherche de retour de la commande, ils sont retournés comme un List objet qui est une propriété du modèle de vue et les affiche dans un tableau ci-dessous le formulaire de recherche.

L'utilisateur a alors la possibilité de sélectionner les dossiers qu'ils aimeraient changer. Ils vont le faire en sélectionnant une case à cocher en regard les enregistrements spécifiés. Puis, à l'aide d'un formulaire qui apparaît ci-dessous la zone de recherche, entrez les nouvelles valeurs et de frapper d'une "mise à Jour" pour enregistrer les modifications. (nous faisons cela afin de permettre à l'utilisateur de faire des mises à jour en masse sans avoir à modifier le tableau ligne par ligne)

Voici une capture d'écran pour illustrer ce que je veux dire. C'est ce à quoi ressemblera la page une fois que l'utilisateur a frappé le bouton "Rechercher":

Modèle d'affichage affichage de la valeur null propriétés au contrôleur

Lorsque l'utilisateur cliquait sur "Rechercher" la forme est invité à poster retour à l'Index de la méthode du contrôleur. Lorsque l'utilisateur appuie sur "Clone Sélectionné les Articles" la forme est invité à poster retour à une "mise à Jour" de la méthode dans le même contrôleur. Cependant, le problème est le point de vue de l'objet du modèle qui sont affichées retour à la "mise à Jour" la méthode est complètement nulle sauf pour les valeurs placées dans le New Territory, New Description, et New Effective Date zones de texte.

Je suis relativement nouveau à l'ASP MVC sorte que toute aide/suggestions seraient appréciées. Je ne sais pas pourquoi le Modèle de Vue nouveau à partir du contrôleur avec les mêmes valeurs, il a été envoyé là-bas tout en utilisant le bouton "Recherche", mais ne sera pas faire à l'aide de la "Clone Éléments Sélectionnés" un.

Modèle de vue (c'est ce qui est posté vers le contrôleur)

public class ZipCodeIndex
{
    public List<ZipCodeTerritory> zipCodeTerritory { get; set; }
    [DisplayName("Zip Code")]
    public string searchZip { get; set; }
    [DisplayName("Effective on this date")]
    public string searchDate { get; set; }
    [DisplayName("State")]
    public string searchState { get; set; }
    [DisplayName("New Territory")]
    public string newTerritory { get; set; }
    [DisplayName("New Description")]
    public string newDescription { get; set; }
    [DisplayName("New Effective Date")]
    public string newEffectiveDate { get; set; }

    public ZipCodeIndex() 
    {
        zipCodeTerritory = new List<ZipCodeTerritory>();
    }
}

Modèle (Ce qui remplit la Liste de l'objet dans la Vue Modèle)

[MetadataType(typeof(ZipCodeTerritoryMetaData))]
public partial class ZipCodeTerritory
{
    public bool Update { get; set; }
}

public partial class ZipCodeTerritory
{
    public string ChannelCode { get; set; }
    public string DrmTerrDesc { get; set; }
    public string IndDistrnId { get; set; }
    public string StateCode { get; set; }
    public string ZipCode { get; set; }
    public System.DateTime EndDate { get; set; }
    public System.DateTime EffectiveDate { get; set; }
    public string LastUpdateId { get; set; }
    public Nullable<System.DateTime> LastUpdateDate { get; set; }
    public int Id { get; set; }
}

Vue

@model Monet.ViewModel.ZipCodeIndex
@using(Html.BeginForm("Index", "ZipCodeTerritory", FormMethod.Post))
{
<div id="searchBox" class="boxMe">
<div id="zipBox">
@Html.Raw("Zip Code")
@Html.TextAreaFor(model => model.searchZip, new { style = "width: 300px;", placeholder = "Enter up to 35 comma separated zip codes" })
</div>
<div id="dateBox">
@Html.LabelFor(model => model.searchDate)
@Html.TextBoxFor(model => model.searchDate, new { style="width: 80px;"})
</div>
<div id="stateBox">
@Html.LabelFor(model => model.searchState)
@Html.TextBoxFor(model => model.searchState, new { style = "width: 25px;" })
<button type="submit">Search</button>
</div>
</div>
<div id="errorStatus">
@ViewBag.ErrorMessage            
</div>
<div style="clear: both;"></div>
}
<br/>
@Html.ActionLink("Create New", "Create")
<br/>
@if (Model != null)
{
using(Html.BeginForm("Update", "ZipCodeTerritory", FormMethod.Post))
{
<div id="cloneBox">
@Html.LabelFor(model => model.newTerritory)
@Html.TextBoxFor(model => model.newTerritory, new { style="width: 30px;padding-left:10px;"})
@Html.LabelFor(model => model.newDescription)
@Html.TextBoxFor(model => model.newDescription, new { style = "width: 250px;padding-left:10px;" })  
@Html.LabelFor(model => model.newEffectiveDate)     
@Html.TextBoxFor(model => model.newEffectiveDate, new { style = "width: 80px;padding-left:10px;" })   
<button type="submit">Clone Selected Items</button>                      
</div>
}    
<table id="thetable" class="tablesorter" >
<thead>
<th></th>
<th>Channel</th>
<th>Territory</th>
<th>Description</th>
<th>State</th>
<th>Zip</th>
<th>Effective</th>
<th>End Date</th>
<th>Last Update By</th>
<th>Last Update Date</th>
<th></th>
</thead>
<tbody>
@foreach (var item in Model.zipCodeTerritory)
{
<tr>
<td>@Html.CheckBoxFor(model => item.Update)</td>
<td>
@Html.DisplayFor(model => item.ChannelCode)
</td>
<td>
@Html.DisplayFor(model => item.IndDistrnId)
</td>
<td>
@Html.DisplayFor(model => item.DrmTerrDesc)
</td>
<td>
@Html.DisplayFor(model => item.StateCode)
</td>
<td>
@Html.DisplayFor(model => item.ZipCode)
</td>
<td>
@Html.DisplayFor(model => item.EffectiveDate)
</td>
<td>
@Html.DisplayFor(model => item.EndDate)
</td>
<td>
@Html.DisplayFor(model => item.LastUpdateId)
</td>
<td>
@Html.DisplayFor(model => item.LastUpdateDate)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.Id })
</td>
</tr>
}
</tbody>
</table>    
}

Contrôleur

    public ViewResult Index(ZipCodeIndex search)
{
try
{
//If search criteria is null page is loading for the first time so send blank view
if (String.IsNullOrWhiteSpace(search.searchZip) &&
String.IsNullOrWhiteSpace(search.searchDate) &&
String.IsNullOrWhiteSpace(search.searchState))
{
return View();
}
//Determine if necessary search criteria has been sent
if (String.IsNullOrWhiteSpace(search.searchZip) && String.IsNullOrWhiteSpace(search.searchState))
{
ViewBag.ErrorMessage = "Either State or Zip Code Must be Specified";
return View(search);
}
DateTime effectiveDate;
//Convert date string to DateTime type
if (String.IsNullOrWhiteSpace(search.searchDate))
{
effectiveDate = DateTime.MinValue;
}
else
{
effectiveDate = Convert.ToDateTime(search.searchDate);
}
//Conduct search by State Code/Date alone
if (String.IsNullOrWhiteSpace(search.searchZip))
{
search.zipCodeTerritory = (from z in db.ZipCodeTerritory
where z.StateCode.Equals(search.searchState) &&
z.EffectiveDate >= effectiveDate
select z).ToList();
return View(search);
}
//Zip codes have been requested to conduct zip search
string[] zipArray;
//Create array and remove white spaces
zipArray = search.searchZip.Split(',').Distinct().ToArray();
for (int i = 0; i < zipArray.Length; i++)
{
zipArray[i] = zipArray[i].Trim();
}
//Determine if state code is being used in search
if (String.IsNullOrWhiteSpace(search.searchState))
{
foreach (var zip in zipArray)
{
var item = from z in db.ZipCodeTerritory
where z.ZipCode.Equals(zip) &&
z.EffectiveDate >= effectiveDate
select z;
search.zipCodeTerritory.AddRange(item);
}
}
else
{
foreach (var zip in zipArray)
{
var item = from z in db.ZipCodeTerritory
where z.ZipCode.Equals(zip) &&
z.EffectiveDate >= effectiveDate &&
z.StateCode.Equals(search.searchState)
select z;
search.zipCodeTerritory.AddRange(item);
}
}
}
catch (DbEntityValidationException dbEx)
{
ViewBag.ErrorMessage = "An error has occurred, we apologize for the incovenience. IT has been notified and will resolve the issue shortly.";
SendEmail.ErrorMail(Common.ErrorCheck.CombineDbErrors(dbEx));
}
catch (Exception ex)
{
ViewBag.ErrorMessage = ErrorCheck.FriendlyError(ex);
SendEmail.ErrorMail(ex);
}
return View(search);
}
[HttpPost]
public ActionResult Update(ZipCodeIndex updateZip)
{
foreach (var zipCode in updateZip.zipCodeTerritory)
{
if (zipCode.Update)
{
try
{
if (!string.IsNullOrEmpty(updateZip.newTerritory)) zipCode.IndDistrnId = updateZip.newTerritory;
if (!string.IsNullOrWhiteSpace(updateZip.newDescription)) zipCode.DrmTerrDesc = updateZip.newDescription;
if (!string.IsNullOrWhiteSpace(updateZip.newEffectiveDate)) zipCode.EffectiveDate = Convert.ToDateTime(updateZip.newEffectiveDate);
db.Entry(zipCode).State = EntityState.Modified;
db.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
ViewBag.ErrorMessage = "An error has occurred, we apologize for the incovenience. IT has been notified and will resolve the issue shortly.";
SendEmail.ErrorMail(Common.ErrorCheck.CombineDbErrors(dbEx));
}
catch (Exception ex)
{
ViewBag.ErrorMessage = "An error has occurred, we apologize for the incovenience. IT has been notified and will resolve the issue shortly.";
SendEmail.ErrorMail("Zip Code not updated: " + zipCode.ToString() + " |MESSAGE| " + ex.Message);
}
}
}
return RedirectToAction("Index", updateZip);
}

MODIFIER

J'ai ajouté les champs cachés de la deuxième forme (que les postes au Update méthode). Cela renvoie aux critères de recherche, cependant, le List objet est toujours vide.

@if (Model != null)
{
using(Html.BeginForm("Update", "ZipCodeTerritory", FormMethod.Post))
{
@Html.HiddenFor(model => model.searchZip)
@Html.HiddenFor(model => model.searchDate)
@Html.HiddenFor(model => model.searchState)
@Html.HiddenFor(model => model.zipCodeTerritory)
<div id="cloneBox">
  • Toutes les erreurs de Modèle?
  • Est-il de votre Modèle.zipCodeTerritory qui n'est pas retourné?
  • Non, c'est le ZipCodeIndex modèle de vue qui revient. Je vais faire une remarque dans le post, merci.
  • désolé de la partie du viewmodel êtes-vous désireux d'être là ce n'est pas. La Liste en bas de page ou est-ce quelque chose d'autre.
  • Je veux la Liste à être là, dans le Update méthode ainsi que quoi que ce soit dans le champs de recherche (zip, état, date). fondamentalement, tout ce qui se trouve affecté de nouveau à la vue de la Index la méthode du contrôleur doit être là quand la page enregistre à la méthode de mise à Jour. La seule différence entre ce qui est renvoyée par le Index et ce qui est envoyé à la Update, il faudrait que le champ booléen de chaque ZipCodeTerritory liste d'objet a été définie sur true (via les cases à cocher dans le tableau).
  • Eh bien, je pense que pour les critères de recherche que ce soit une forme différente sa ne va pas comme. Alors pour la liste méthode displayfor ne pas transférer à un serveur, vous avez besoin de mettre un autre champ hiddenfor à côté d'elle pour enregistrer les données. Je viens de l'essayer sur un ou deux et de le tester. Si l'un des qui aide les malades de la mettre dans une réponse.
  • Bon appel, qui a rapporté les critères de recherche quand je poste retour à la Update contrôleur, mais l'objet de la Liste est toujours vide. J'ai élargi le formulaire pour inclure la table et a obtenu les mêmes résultats.

InformationsquelleAutor NealR | 2013-10-02