发送到控制器时丢失的值

本文关键字:控制器 | 更新日期: 2023-09-27 17:54:45

我想发送我的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")
}

发送到控制器时丢失的值

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

EmailFormModel model     = new EmailFormModel();  
Session[SESSION_SAVED_MODEL]=model;  
return View(model);
你应该在lambda表达式 处使用Model
 @Html.TextBoxFor(m => Model.Prosjektleder, new { @class = "html_label" })

你所要做的就是在html属性中添加@Name,然后你就不需要使用session了。

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