none
Passar ID para outras views/controllers RRS feed

  • Pergunta

  • Bom dia, amigos.

    Estou criando, para estudar MVC, uma plataforma de forum. Estou tentando passar informações entre views e controllers e não estou obtendo sucesso.

    O que eu desejo é o seguinte:

    A lista de todos os foruns, quando clicar em entrar, uma lista das seções desse forum e um botao "nova seção", quando entrar na seção, uma lista de tópicos desta seção e assim por diante.

    Já consegui fazer os forums e listar as seções. O que me falta agora, é passar o Id do forum que eu estou para a FK na tabela seção.

    O que fiz atualmente foi isso:

    ForumController:

    //Na listagem dos foruns, tem um link "Entrar"
    public ActionResult EnterForum(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        var sections = db.Sections.Where(x => x.Forum.ForumId == (int)id).ToList();
        return View(sections);
    }


    SectionController

    public ActionResult Index(int? id)
    {
        ViewBag.ForumId = id;
    
        var sections = db.Sections.Include(s => s.CreatedBy);
        return View(sections.Where(x => x.Forum.ForumId == id).ToList());
    }
    
    public ActionResult Create([Bind(Include = "SectionId,SectionName,SectionUrlName,CreationDate,CreatedById")] Section section)
    {
        if (ModelState.IsValid)
        {
            var userId = User.Identity.GetUserId();
            var user = db.Users.Where(x => x.Id == userId).FirstOrDefault();
    
            section.CreatedBy = user;
            section.CreationDate = DateTime.Now;
            section.CreatedById = User.Identity.GetUserId();
            section.Forum.ForumId = //precisa receber o ForumId;
    
            db.Sections.Add(section);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    
        ViewBag.CreatedById = new SelectList(db.Users, "Id", "FirstName", section.CreatedById);
        return View(section);
    }

    Quando eu clico em "Criar Nova Seção" a URL fica assim:
    https://localhost:44300/Section/Create?ForumId=5

    Ou seja, estou conseguindo manter o ForumId, só não estou conseguindo passar esse valor para a tabela quando eu clico em salvar.

    Valeu :)


    Leonardo D'Amato


    quarta-feira, 11 de novembro de 2015 12:17

Respostas

  • Opa... disculpa meu não entendi X)

    Quando eu clico em "Criar Nova Seção" a URL fica assim:
    https://localhost:44300/Section/Create?ForumId=5

    Ou seja, estou conseguindo manter o ForumId, só não estou conseguindo passar esse valor para a tabela quando eu clico em salvar.

    Então acho que o erro esta no Helper no Index.cshtml: 

    @Html.ActionLink("Create New", "Create", new { ForumId = ViewBag.ForumId }, new { ForumId = ViewBag.ForumId }) |
    </p>

     Tenta assim:

    @Html.ActionLink("Create New", "Create","NomeController", new { id = ViewBag.ForumId },null) |
    </p>

    Assim deveria funcionar, acontece que nas sua rota "Default" no arquivo RouteConfig na pasta App_Start, existe uma rota padrão como esta aqui

    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    então você não pode passar ForumId, tem que ser mesdmo id

    quarta-feira, 11 de novembro de 2015 18:12

Todas as Respostas

  • Olá Leandro,

    Acho que tem alguns conceitos errados, aqui tenho um exemplo, para deixar ele simples, esqueci as boas praticas ;)

     [HttpGet]
            public ActionResult Create(int id)
            {
                Produto produto= new Produto();
                produto.CategoriaId = id;
                return View(produto);
            }
    
            [HttpPost]
    
            public ActionResult Create(Produto produto)
            {
                try
                {
                    if (ModelState.IsValid) 
                    {
                       produto.Data=DateTime.Now;
                       // Aqui a logica para guardar a entidade na BD
                    }
    
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError(String.Empty,ex.Message);
                }
                return View(produto);
            }

    quarta-feira, 11 de novembro de 2015 12:33
  • Não entendi, cara.

    No index eu consigo pegar o ForumId, mas no Create não.

    // Aqui ele traz a lista de Seções de um dos foruns (no caso, o que eu entrei)
    public ActionResult Index(int id)
    {
        ViewBag.ForumId = id;
        var sections = db.Sections.Include(s => s.CreatedBy).Where(x => x.Forum.ForumId == id).ToList();
        return View(sections);
    }
    
    public ActionResult Create()
    {
        ViewBag.CreatedById = new SelectList(db.Users, "Id", "FirstName");
        Section section = new Section();
        return View(section);
    }
    
    public ActionResult Create([Bind(Include = "SectionId,SectionName,SectionUrlName,CreationDate,CreatedById")] Section section)
    {
        if (ModelState.IsValid)
        {
            var userId = User.Identity.GetUserId();
            var user = db.Users.Where(x => x.Id == userId).FirstOrDefault();
    
            section.Forum.ForumId = //AQUI EU PRECISO PASSAR AQUELE ID QUE ESTÁ NA INDEX DO SectionController
            section.CreatedBy = user;
            section.CreationDate = DateTime.Now;
            section.CreatedById = User.Identity.GetUserId();
    
            db.Sections.Add(section);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    
        ViewBag.CreatedById = new SelectList(db.Users, "Id", "FirstName", section.CreatedById);
        return View(section);
    }
    

    Resumindo, preciso pegar o parametro que ta na ActionResult Index, e passar para a variavel que está dentro da ActionResult Create.


    Leonardo D'Amato

    quarta-feira, 11 de novembro de 2015 17:00
  • Você precisa declarar qual action vai receber o POST

    [HttpPost]

    public ActionResult Create([Bind(Include = "SectionId,SectionName,SectionUrlName,CreationDate,CreatedById")] Section section) {

    quarta-feira, 11 de novembro de 2015 17:22
  • Isso já está.

    Leonardo D'Amato

    quarta-feira, 11 de novembro de 2015 17:25
  • Mostra o codigo da sua View por favor...
    quarta-feira, 11 de novembro de 2015 17:31
  • Index

    @model IEnumerable<Zorum.Models.Section>
    
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    <p>
        @Html.ActionLink("Create New", "Create", new { ForumId = ViewBag.ForumId }, new { ForumId = ViewBag.ForumId }) |
    </p>
    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.CreatedBy.FirstName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.SectionName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.SectionUrlName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.CreationDate)
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.CreatedBy.FirstName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.SectionName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.SectionUrlName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CreationDate)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.SectionId }) |
                @Html.ActionLink("Details", "Details", new { id=item.SectionId }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.SectionId })
            </td>
        </tr>
    }
    
    </table>

    Create

    @model Zorum.Models.Section
    
    @{
        ViewBag.Title = "Create";
    }
    
    <h2>Create</h2>
    
    
    @using (Html.BeginForm()) 
    {
        @Html.AntiForgeryToken()
        
        <div class="form-horizontal">
            <h4>Section</h4>
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(model => model.SectionName, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.SectionName, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.SectionName, "", new { @class = "text-danger" })
                </div>
            </div>
    
            <div class="form-group">
                @Html.LabelFor(model => model.SectionUrlName, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.SectionUrlName, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.SectionUrlName, "", new { @class = "text-danger" })
                </div>
            </div>
            </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
    }
    
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }



    Leonardo D'Amato

    quarta-feira, 11 de novembro de 2015 17:35
  • Opa... disculpa meu não entendi X)

    Quando eu clico em "Criar Nova Seção" a URL fica assim:
    https://localhost:44300/Section/Create?ForumId=5

    Ou seja, estou conseguindo manter o ForumId, só não estou conseguindo passar esse valor para a tabela quando eu clico em salvar.

    Então acho que o erro esta no Helper no Index.cshtml: 

    @Html.ActionLink("Create New", "Create", new { ForumId = ViewBag.ForumId }, new { ForumId = ViewBag.ForumId }) |
    </p>

     Tenta assim:

    @Html.ActionLink("Create New", "Create","NomeController", new { id = ViewBag.ForumId },null) |
    </p>

    Assim deveria funcionar, acontece que nas sua rota "Default" no arquivo RouteConfig na pasta App_Start, existe uma rota padrão como esta aqui

    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    então você não pode passar ForumId, tem que ser mesdmo id

    quarta-feira, 11 de novembro de 2015 18:12
  • Agora sim deu hahahaha!

    Valeu, parceiro.


    Leonardo D'Amato

    quarta-feira, 11 de novembro de 2015 21:14