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

Asked

Viewed 472 times

3

I’m starting in Asp net mvc and I’m not able to take the changed data from a simple model and move to another view. Follow 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 index method showing 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 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 of my txt in the index and send it to the list view running this change it informs that the method comes null. It may be a very stupid question neh kkk but I’m here seeking knowledge.

3 answers

2

You don’t need 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, la in the first line of your view, the code:

@model nomeProjeto.seuModelo

and where in your View you have @Viewdata, you replace it with:

@Model.campoProduto

For example:

@Model.Tamanho

That should do it. By entering this tag that I mentioned above, it already retrieves all the information that you entered in your controller.

2

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

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

The name of the fields in your form must be the same names as your fields Action Waiting list.

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

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 renamed the attribute name of inputs of:

Txtprodutoid, Txtprodutodescricao, Txtprodutotype, Txtprodutosize, Txtprodutovalue

To:

Productoid Description Like, Size, Valor

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

  • Guys. Solved, I made all the modifications that informed , helped me to clean my application full of useless codes. Thank you very much, to all my sincere thanks!!:)

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’d get your values back in the 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 values are already arriving by parameter in your method List() 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);
    }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.