发送到控制器时丢失的值

时间:2016-07-04 12:12:50

标签: c# html asp.net-mvc

我想将包含Ressurs列表的EmailFormModel发送到控制器,我想用它来处理它。但是我永远无法访问控制器中的EmailFormModel中的值。我试图通过使用Sessions克服这个问题,但它仍然无法正常工作。 列表Ressurs包含几个Ressursbehov,但是从来没有多个EmailFormModel。

我的控制器

namespace WebApplication6.Controllers
{
    public class AppController : Controller
    {
        const string SESSION_SAVED_MODEL = "savedModel";
        [HttpGet]
        public ActionResult Index()
        {
            Session[SESSION_SAVED_MODEL] = new EmailFormModel();                  
            return View(Session[SESSION_SAVED_MODEL]);
        }
        public ActionResult Sent()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Index(EmailFormModel model)
        {
            //other irrelevant code
            if (Request.Params["Ekstra_Ressurs"] != null)
            {
                model.Ressurs.Add(new RessursBehov());
                Session[SESSION_SAVED_MODEL] = model;
            }  
        }
        return View(model);
    }    
}

我的模特

namespace WebApplication6.Models
{
    public class EmailFormModel
    {
        [Required, Display(Name = "Prosjektnummer")]
        public string Prosjektnummer { get; set; }
        [Required, Display(Name = "Prosjektnavn")]
        public string Prosjektnavn { get; set; }
        [Required, Display(Name = "Prosjekttype")]
        public string Prosjekttype { get; set; }
        [Required, Display(Name = "Prosjektleder")]
        public string Prosjektleder { get; set; }
        public List<RessursBehov> Ressurs = new List<RessursBehov>() 
        { 
            new RessursBehov() };
        }
        public class RessursBehov
        { 
            [Required, Display(Name = "Ressurstype")]
            public string Ressurstype { get; set; }
            [Required, Display(Name = "Navn på ressurs")]
            public string Navn_På_Ressurs { get; set; }
            [Required, Display(Name = "Ukenummer")]
            public int? Ukenummer { get; set; }
            [Required, Display(Name = "Antall timer")]
            public int? Antall_Timer { get; set; }
            [Required, Display(Name = "Antall uker")]
            public int? Antall_Uker { get; set; }
        }
    } 
}

我的观点

@model WebApplication6.Models.EmailFormModel
@{
ViewBag.Title = "Registrer nytt prosjekt";

List<SelectListItem> prosjektTypeListe = new List<SelectListItem>()
    {
        new SelectListItem { Text = "Prosjekt", Value = "Prosjekt" },
        new SelectListItem { Text = "Forvaltning", Value = "Forvaltning" }
    };

 List<SelectListItem> ressurstypeliste = new List<SelectListItem>()
    {
        new SelectListItem { Text = "utvikler", Value = "utvikler" },
        new SelectListItem { Text = "frontendutvikler", Value = "frontendutvikler" },
        new SelectListItem { Text = "epi-utvikler", Value = "epi-utvikler" },
        new SelectListItem { Text = "webnodesutvikler", Value = "webnodesutvikler" },
        new SelectListItem { Text = "designer", Value = "designer" },
        new SelectListItem { Text = "rådgiver", Value = "rådgiver" },
        new SelectListItem { Text = "prosjektleder", Value = "prosjektleder" }
    };
}
<div class="title">
<div class="text-center">
    <h2>@ViewBag.Title</h2>
</div>
</div>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()


<div class="rows">

    <div class="row">
        <div class="col-md-4"></div>
        @Html.LabelFor(m => m.Prosjektnummer, new { @class = "col-md-1 text-center" })
        <div class="col-md-7">
            @Html.TextBoxFor(m => m.Prosjektnummer, new { @class = "html_label" })               
            @Html.ValidationMessageFor(m => m.Prosjektnummer)
        </div>
    </div>



    <div class="row">
        <div class="col-md-4"></div>
        @Html.LabelFor(m => m.Prosjektnavn, new { @class = "col-md-1 text-center" })
        <div class="col-md-7">
            @Html.TextBoxFor(m => m.Prosjektnavn, new { @class = "html_label" })
            @Html.ValidationMessageFor(m => m.Prosjektnavn)
        </div>
    </div>



    <div class="row">

        <div class="col-md-4"></div>
        @Html.LabelFor(m => m.Prosjekttype, new { @class = "col-md-1 text-center" })
        <div class="col-md-7">
           @Html.DropDownListFor(m => m.Prosjekttype, prosjektTypeListe, "-- Velg Prosjekttype --",  new { @class = "dropdown" })
        </div>

    </div>

    <div class="row">
        <div class="col-md-4"></div>
        @Html.LabelFor(m => m.Prosjektleder, new { @class = "col-md-1 text-center" }) <!--tar inn m som parameter og returnerer m.prosjektleder-->
        <div class="col-md-7">
            @Html.TextBoxFor(m => m.Prosjektleder, new { @class = "html_label" })
            @Html.ValidationMessageFor(m => m.Prosjektleder)
        </div>
    </div>



    @for (var i = 0; i < Model.Ressurs.Count; i++)
    {


        <div class="row">

            <div class="col-md-4"></div>
            @Html.LabelFor(m => Model.Ressurs[i].Ressurstype, new { @class = "col-md-1 text-center" })
            <div class="col-md-7">
                @Html.DropDownListFor(m => Model.Ressurs[i].Ressurstype, ressurstypeliste, "-- Velg ressurstype --", new { @class = "dropdown" })
            </div>

        </div>

        <div class="row">
            <div class="col-md-3"></div>
            @Html.LabelFor(m => Model.Ressurs[i].Navn_På_Ressurs, new { @class = "col-md-2 text-right" })
            <div class="col-md-7">
                @Html.TextBoxFor(m => Model.Ressurs[i].Navn_På_Ressurs, new { @class = "html_label" })
                @Html.ValidationMessageFor(m => Model.Ressurs[i].Navn_På_Ressurs)
            </div>
        </div>


        <div class="row">
            <div class="col-md-4"></div>
            @Html.LabelFor(m => Model.Ressurs[i].Ukenummer, new { @class = "col-md-1 text-center" })
            <div class="col-md-7">
                @Html.TextBoxFor(m => Model.Ressurs[i].Ukenummer, new { @class = "html_label" })
                @Html.ValidationMessageFor(m => Model.Ressurs[i].Ukenummer)
            </div>
        </div>
        <div class="row">
            <div class="col-md-4"></div>
            @Html.LabelFor(m => Model.Ressurs[i].Antall_Timer, new { @class = "col-md-1 text-center" })
            <div class="col-md-7">
                @Html.TextBoxFor(m => Model.Ressurs[i].Antall_Timer, new { @class = "html_label" })
                @Html.ValidationMessageFor(m => Model.Ressurs[i].Antall_Timer)

            </div>
        </div>

        <div class="row">
            <div class="col-md-4"></div>
            @Html.LabelFor(m => Model.Ressurs[i].Antall_Uker, new { @class = "col-md-1 text-center" })
            <div class="col-md-7">
                @Html.TextBoxFor(m => Model.Ressurs[i].Antall_Uker, new { @class = "html_label" })
                @Html.ValidationMessageFor(m => Model.Ressurs[i].Antall_Uker)
            </div>
        </div>
    }



    <br />

    <div class="row">
        <div class="col-md-5"></div>
        <div class="col-md-2">
            <input type="submit" class="btn btn-default" value="Legg til ressurser" name="Ekstra_Ressurs" />
        </div>

        <div class="col-md-2">
            <input type="submit" class="btn btn-primary" value="Send inn mail" name="Sendknapp" />
        </div>                        
</div>
}

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

2 个答案:

答案 0 :(得分:1)

为了在HttpPost Index行动中达到模型
1)您应该在GET索引操作方法中将EmailFormModel类型模型传递给View。

EmailFormModel model     = new EmailFormModel();  
Session[SESSION_SAVED_MODEL]=model;  
return View(model);

2)你应该在lambda表达式上使用Model

 @Html.TextBoxFor(m => Model.Prosjektleder, new { @class = "html_label" })

使用Model更改所有ms。

答案 1 :(得分:-1)

您所要做的就是在html属性中添加@Name,然后您也不需要使用会话。

  @Html.DropDownListFor(m => m.Prosjekttype, prosjektTypeListe  , "-- Velg Prosjekttype --", new { @class = "dropdown" , @Name = "Prosjekttype" })