Asp mvc how to change model data and move to another view

3

I'm starting in asp net mvc and I'm not able to get the changed data from a simple model and switch to another view. Here are the codes:

Model:

public class Produto
    {
        public int ProdutoId { get; set; }
        public string Descricao { get; set; }
        public string Tipo { get; set; }
        public string Tamanho { get; set; }
        public double Valor { get; set; }

    }

Controller method index that shows model data:

public ActionResult Index()
        {

            Produto produto = new Models.Produto
            {
                ProdutoId = 1,
                Descricao = "Calça jeans Pitbull",
                Tipo = "Calça",
                Tamanho = "40",
                Valor = 59.99



            };

            ViewData["ProdutoId"] = produto.ProdutoId;
            ViewData["Descricao"] = produto.Descricao;
            ViewData["Tipo"] = produto.Tipo;
            ViewData["Tamanho"] = produto.Tamanho;
            ViewData["Valor"] = produto.Valor;


            return View();
        }

    @model Introducao.Models.Produto
@{
    ViewBag.Title = "Inicio";
}

List method that will change the model data:

[HttpPost]
        public ActionResult Lista(int? ProdutoId, string Descricao, string Tipo, string Tamanho, double? Valor)
        {
            Produto produto = new Models.Produto();
            TempData["Produto"] = produto;

            ViewData["ProdutoId"] = ProdutoId;
            ViewData["Descricao"] = Descricao;
            ViewData["Tipo"] = Tipo;
            ViewData["Tamanho"] = Tamanho;
            ViewData["Valor"] = Valor;


            return View(produto);
        }

View List that will show changed model data:

<h2>Meu Site!</h2>
<p>Meu Conteúdo</p>
<form action="Home/Lista" method="post">
    <fieldset>
        <legend>Produtos</legend>

        <div>
            <label for="LblProdutoId">Código</label>
        </div>
        <input type="number" value="@ViewData["ProdutoId"]" name="TxtProdutoId" />
        <div>
            <label for="LblProdutoDescricao">Descrição</label>
        </div>
        <div>
            <input type="text" value="@ViewData["Descricao"]" name="TxtProdutoDescricao" />
        </div>
        <div>
            <label for="LblProdutoTipo">Tipo</label>
        </div>
        <div>
            <input type="text" value="@ViewData["Tipo"]" name="TxtProdutoTipo" />
        </div>
        <div>
            <label for="LblProdutoTamanho">Tamanho</label>
        </div>
        <div>
            <input type="text" value="@ViewData["Tamanho"]" name="TxtProdutoTamanho" />
        </div>
        <div>
            <label for="LblProdutoValor">Valor(Unit.)</label>
        </div>
        <div>
            <input type="text" value="@ViewData["Valor"]" name="TxtProdutoValor" />
        </div>
        <p><input type="submit" value="Enviar" /></p>
    </fieldset>
</form> 

Then in this case when I run the project and pass the values from my txt in the index and I command it to pass to the list view by executing this change it informs that the method comes null. It may be a pretty good question, neh kkk but I'm here looking for knowledge.

    
asked by anonymous 27.09.2018 / 05:03

3 answers

2
    public ActionResult Index()
    {
        Produto produto = new Models.Produto
        {
            ProdutoId = 1,
            Descricao = "Calça jeans Pitbull",
            Tipo = "Calça",
            Tamanho = "40",
            Valor = 59.99
        };

        return View(produto);
    }

So you would retrieve the values in View ().

@model Models.Produto
<form action="Home/Lista" method="post">
<fieldset>
    <legend>Produtos</legend>

    <div>
        <label for="LblProdutoId">Código</label>
    </div>
    <input type="number" value="@Model.ProdutoId" name="ProdutoId" />
    <div>
        <label for="Descricao">Descrição</label>
    </div>
    <div>
        <input type="text" value="@Model.Descricao" name="Descricao" />
    </div>
    <div>
        <label for="Tipo">Tipo</label>
    </div>
    <div>
        <input type="text" value="@Model.Tipo" name="Tipo" />
    </div>
    <div>
        <label for="tamanho">Tamanho</label>
    </div>
    <div>
        <input type="text" value="@Model.Tamanho" name="Tamanho" />
    </div>
    <div>
        <label for="Valor">Valor(Unit.)</label>
    </div>
    <div>
        <input type="text" value="@Model.Valor" name="Valor" />
    </div>
    <p><input type="submit" value="Enviar" /></p>
</fieldset>

If the values are already arriving by parameter in your List () method I believe I could improve it by doing so:

    [HttpPost]
    public ActionResult Lista(Models.Produto produto)
    {
        //Instancia seu objeto
        Produto produto = produto;

        return View(produto);
    }
    
27.09.2018 / 14:35
2

You do not need the ViewData, because when you send your model to the view, which in this case is a product type object, it already retrieves all the information you need. What you need is just insert it in the first line of your view, the code:

@model nomeProjeto.seuModelo

And where in your View you have @ViewData, you replace with:

@Model.campoProduto

For example:

@Model.Tamanho

That should solve.  you insert this tag that I mentioned above, it already retrieves all the information you entered in your controler.

    
27.09.2018 / 14:07
2

Asp.Net MVC can pass data to Actions via parameters of primitive type (int, string, double, etc ...) or type complex (an object, such as Models.Product for example).

In your example, using primitive types , when you do the POST page, MVC will attempt to associate form data with Action by name.

The field names of your form must be the same field names as your Action List waits.

So one way to resolve this is to rename the form fields according to the Action fields.

Change your View Index :

@model WebApplication1.Models.Produto

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<h2>Meu Site!</h2>
<p>Meu Conteúdo</p>
<form action="Lista" method="post">
    <fieldset>
        <legend>Produtos</legend>

        <div>
            <label for="LblProdutoId">Código</label>
        </div>
        <input type="number" value="@ViewData["ProdutoId"]" name="ProdutoId" />
        <div>
            <label for="LblProdutoDescricao">Descrição</label>
        </div>
        <div>
            <input type="text" value="@ViewData["Descricao"]" name="Descricao" />
        </div>
        <div>
            <label for="LblProdutoTipo">Tipo</label>
        </div>
        <div>
            <input type="text" value="@ViewData["Tipo"]" name="Tipo" />
        </div>
        <div>
            <label for="LblProdutoTamanho">Tamanho</label>
        </div>
        <div>
            <input type="text" value="@ViewData["Tamanho"]" name="Tamanho" />
        </div>
        <div>
            <label for="LblProdutoValor">Valor(Unit.)</label>
        </div>
        <div>
            <input type="text" value="@ViewData["Valor"]" name="Valor" />
        </div>
        <p><input type="submit" value="Enviar" /></p>
    </fieldset>
</form>

I have renamed the name of the inputs attribute of:

TxtProductId, TxtProductDescription, TxtProductType, TxtProductSize, TxtProductValue

To:

ProductId, Description, Type, Size, Value

So when you click Submit, MVC will do a POST on the Action list (according to the <form action="Lista" method="post"> line), checking the name of the form fields with the respective field names that the Action List expects.

    
27.09.2018 / 14:08