我目前正在构建一个HTML表单,该表单接受用户输入,从中创建消息正文,然后通过电子邮件发送给我。由于用户需要填写10个不同的输入字段,因此我想将字符串连接成单个字符串-messageBody。当我用{get;组;在模型中,它们必须是Public,以便我可以在视图中的表单上访问它们。但是,当我尝试连接模型中的所有字符串时,我不能这样做,因为“字段初始化器无法引用非静态字段”。我尝试将字符串更改为“公共静态字符串”,并允许我在模型中引用这些字符串,但是由于“无法使用实例引用进行访问;因此,请使用类型名称对其进行限定,因此它不再可以在视图中引用这些字符串。 。”我将它们切换回“公共字符串”,并认为也许可以在视图本身中的Razor中将它们连接起来,但是当我尝试这样做时,它无法识别字符串,因为“名称“ myString”在当前情况。”
我对下一步的尝试感到迷茫。根据我的理解(不是很好),为了从视图访问它们,字符串必须是公共的,但是对于我来说,将它们连接为单个字符串也必须是静态的?对我来说没有太大意义,我真的希望我只是在某个地方搞砸了。
我的模型如下:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace CuttingEdgeWebsite2._0.Models
{
public class ServiceRequest
{
[Key]
public int serviceRequestID { get; set; }
[Required]
public string serviceRequestName { get; set; }
[Required]
public string serviceRequestEmail { get; set; }
public string serviceRequestCompany { get; set; }
public string serviceRequestAddress { get; set; }
[Required]
public string serviceType { get; set; }
public string serviceRequestCity { get; set; }
public string serviceRequestState { get; set; }
public string serviceRequestZip { get; set; }
[Required]
public string serviceRequestNumber { get; set; }
public string serviceRequestComments { get; set; }
}
}
我的视图如下:
@model MyWebsite.Models.ServiceRequest
@using (Html.BeginForm("Email", "ServiceRequestsController", FormMethod.Post))
{
<div class="servicesReq">
<div class="serviceReqForm">
<div class="col-left">
<label>
<span class="required">* </span><span>Name:</span><br />
@Html.TextBoxFor(model => model.serviceRequestName)
</label><br />
<label>
<span class="required">* </span><span>Email:</span><br />
@Html.TextBoxFor(model => model.serviceRequestEmail)
</label><br />
<label>
<span>Company:</span><br />
@Html.TextBoxFor(model => model.serviceRequestCompany)
</label><br />
<label>
<span>Address:</span><br />
@Html.TextBoxFor(model => model.serviceRequestAddress)
</label><br /><br />
</div>
<div class="serviceTypeGrid">
<span class="required">* </span><span>Please choose what type of servicing you require:</span><br /><br />
</div>
<div class="col-left2">
<label class="serviceType">
<input type="radio" name="serviceType" value="Electrical" /> Electrical<br />
<input type="radio" name="serviceType" value="Lighting" /> Lighting<br />
<input type="radio" name="serviceType" value="Energy" /> Energy<br />
<input type="radio" name="serviceType" value="Multiple" /> Multiple<br />
</label><br /><br />
</div>
<div class="col-right">
<label>
<span>City:</span><br />
@Html.TextBoxFor(model => model.serviceRequestCity)
</label><br />
<label>
<span>State:</span><br />
@Html.TextBoxFor(model => model.serviceRequestState)
</label><br />
<label>
<span>Zip Code:</span><br />
@Html.TextBoxFor(model => model.serviceRequestZip)
</label><br />
<label>
<span class="required">* </span><span>Phone Number:</span><br />
@Html.TextBoxFor(model => model.serviceRequestNumber)
</label><br />
</div>
<label class="commentText">
<span>Comments:</span><br />
@Html.TextAreaFor(model => model.serviceRequestComments, new { @class = "servReqComment" })
</label>
<div class="formSubmitButton">
<input type="submit" value="Submit" /><br />
<br />
</div>
</div>
</div>
}
在这种情况下,关于在何处/如何连接字符串的任何想法将不胜感激。
答案 0 :(得分:4)
我不会在Razor中管理数据,而是让控制器来管理和准备数据。
您的ServiceRequestController / Email方法将收到ServiceRequest对象的一个实例作为参数(由于您使用的是POST方法,所以我假设这样做)。
在该方法上,您可以轻松地添加一个过程以遍历ServiceRequest对象的属性并将它们连接为字符串(这是假定您用','分隔值)。
[HttpPost]
public ActionResult Email(ServiceRequest myData)
{
try
{
var myConcatenatedSrr =
string.Join(",",myData.prop1,myData.prop2,myData.prop3, ....)
//Your e-mail logic here...
}
catch (System.Exception)
{
throw;
}
}
希望这会有所帮助。
答案 1 :(得分:1)
我发现您在视图上使用了不同的名称空间。您的模型仍然位于CuttingEdgeWebsite2._0.Models
下,并且您正在使用MyWebsite.Models.ServiceRequest
作为视图。
要连接所有字符串,您可以采用几种方法。在模型内添加GetMessage()
方法:
public string GetMessage()
{
return $"{serviceRequestID} {serviceRequestName} {serviceRequestEmail} {serviceRequestCompany} {serviceRequestAddress} {serviceType} {serviceRequestCity} {serviceRequestState} {serviceRequestZip} {serviceRequestNumber} {serviceRequestComments}"
}
并在任何需要的地方使用此方法。您也可以按照@ valvestater65
所述的方式进行操作