2 votes

L'objet de la propriété du modèle n'est pas reçu dans le contrôleur

Je veux accéder à la propriété "Locality" du modèle "Address" dans le contrôleur. Si j'essaie d'assigner une valeur, cela me donne une erreur : La référence à un objet n'est pas définie comme une instance d'un objet.

Modèle :

public class Profile
{
    public string Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
    public DateTime DOB { get; set; }
}
public class Address
{
    public int FlatNumber { get; set; }
    public string Street { get; set; }
    public string Locality { get; set; }
}

Contrôleur :

 public ActionResult Details(Profile pf)
    {
        pf.Address.Locality = "abc";
        return View();
    }

Voir :

@model DownloadFileTest.Models.Profile
     <table>
                <tr>
                    <td style="font-weight:bold">ID</td>
                    <td>@Html.HiddenFor(Model => Model.Id)</td>
                </tr>
                <tr>
                    <td style="font-weight:bold">Name</td>
                    <td>@Html.TextBoxFor(Model => Model.Name, new { @class = "form-control fact", @disabled = "true" })</td>
                </tr>
                <tr>
                    <td style="font-weight:bold">Flat number( Large, Medium and Small)</td>
                    <td>@Html.TextAreaFor(Model => Model.Address.FlatNumber, new { htmlAttributes = new { @class = "form-control" }, rows = "3", cols = "50", @disabled = "true", @class = "fact" })</td>
                </tr>
                <tr>
                    <td style="font-weight:bold">Street</td>
                    <td>@Html.TextBoxFor(Model => Model.Address.Street, new { @class = "form-control fact", @disabled = "true" })</td>
                </tr>
            </table>

1voto

teo van kot Points 3477

Sur votre vue, vous avez tous Address les propriétés marquées comme @disabled = "true" Ainsi, lorsque vous POST votre formulaire, rien n'est affiché. C'est pourquoi le liant de modèle MVC ne lie rien et que vous obtenez null en Address propriété de Profile classe.

Vous pouvez le réparer comme ceci :

 public ActionResult Details(Profile pf)
 {
     pf.Address = new Address();
     pf.Address.Locality = "abc";
     return View();
 }

Ou même le faire comme ça :

public class Profile
{
    public Profile()
    {
        Address = new Address(); //here
    }

    public string Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
    public DateTime DOB { get; set; }
}

Notez que le constructeur sans paramètre sera appelé avant le processus de liaison, donc si vous avez déjà envoyé des valeurs POST Address, la liaison se fera correctement.

0voto

Vous devez passer le modèle à la vue

public ActionResult Details(Profile pf)
{
    pf.Address.Locality = "abc";
    return View(pf);
}

Pour renvoyer les données au contrôleur, vous devez mettre en place un formulaire :

@using (Html.BeginForm("myActionName", "MyControllerName", null, FormMethod.Post, new { @class = "form-horizontal" }))
    {
        <table>
            <tr>
                <td style="font-weight:bold">ID</td>
                <td>@Html.HiddenFor(Model => Model.Id)</td>
            </tr>
            <tr>
                <td style="font-weight:bold">Name</td>
                <td>@Html.TextBoxFor(Model => Model.Name, new { @class = "form-control fact", @disabled = "true" })</td>
            </tr>
            <tr>
                <td style="font-weight:bold">Flat number( Large, Medium and Small)</td>
                <td>@Html.TextAreaFor(Model => Model.Address.FlatNumber, new { htmlAttributes = new { @class = "form-control" }, rows = "3", cols = "50", @disabled = "true", @class = "fact" })</td>
            </tr>
            <tr>
                <td style="font-weight:bold">Street</td>
                <td>@Html.TextBoxFor(Model => Model.Address.Street, new { @class = "form-control fact", @disabled = "true" })</td>
            </tr>
        </table>
        <input type="submit" class="btn btn-success btn-block" value="Submit" />
    }

Dans le contrôleur :

[HttpPost]
public ActionResult Details(Profile pf)
{
    // My Stuff
    return View();
}

Quelques lectures sur la reliure

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X