连接多个字符串,发送给控制器?

时间:2018-12-20 15:38:47

标签: c# html asp.net-mvc razor concatenation

我目前正在构建一个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>
}

在这种情况下,关于在何处/如何连接字符串的任何想法将不胜感激。

2 个答案:

答案 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

所述的方式进行操作