ASP.NET MVC 5中嵌入PHP代码运行时原样显示的解决方法咨询
这个问题其实很常见——你的ASP.NET MVC项目托管在IIS上,而IIS默认没有配置PHP运行环境,所以服务器不会执行PHP代码,只会把它当作普通文本发送给浏览器,自然就直接显示出来了。下面给你两种解决方案,看哪种更适合你的需求:
方案一:配置IIS支持PHP(如果你必须保留PHP代码)
如果因为某些原因你一定要用PHP处理表单逻辑,那得先让IIS能解析PHP文件:
- 第一步:下载匹配你系统和IIS版本的PHP安装包(比如x86/x64对应你的服务器位数),解压到本地目录,比如
C:\PHP。 - 第二步:打开IIS管理器,点击服务器节点,找到「处理程序映射」,右键选择「添加模块映射」:
- 请求路径填
*.php - 模块选择
FastCgiModule - 可执行文件选择你解压的PHP目录里的
php-cgi.exe(比如C:\PHP\php-cgi.exe) - 名称随便填,比如「PHP FastCGI」
- 点击确定,确认添加这个映射。
- 请求路径填
- 第三步:注意不要把PHP代码直接嵌入
.cshtml视图里,因为.cshtml是ASP.NET的视图文件,IIS会交给ASP.NET引擎处理,不会触发PHP解析。你需要把PHP逻辑放到独立的.php文件中,比如contact.php,然后在HTML表单的action属性指向这个文件:<form action="/contact.php" method="post"> <!-- 你的表单元素 --> </form> - 第四步:测试配置是否成功——新建一个
info.php文件,内容写<?php phpinfo(); ?>,访问这个文件如果能显示PHP的信息页面,说明配置没问题了。
方案二:改用ASP.NET MVC实现表单逻辑(更推荐)
既然你的项目本身就是ASP.NET MVC,完全没必要混合PHP,用C#实现表单逻辑会更统一,也避免了配置多语言环境的麻烦,步骤如下:
- 创建ContactModel模型类(放在项目的Models文件夹下):
public class ContactModel { [Required(ErrorMessage = "请输入姓名")] public string Name { get; set; } [Required(ErrorMessage = "请输入邮箱")] [EmailAddress(ErrorMessage = "邮箱格式不正确")] public string Email { get; set; } [Required(ErrorMessage = "请输入主题")] public string Subject { get; set; } [Required(ErrorMessage = "请输入消息内容")] public string Message { get; set; } } - 创建ContactController控制器:
public class ContactController : Controller { // 显示联系表单页面 public ActionResult Index() { return View(); } // 处理表单提交 [HttpPost] public ActionResult Submit(ContactModel model) { if (ModelState.IsValid) { // 这里写你的表单处理逻辑,比如发送邮件、保存到数据库 // 示例:发送邮件(需要配置SMTP服务器) // var mail = new System.Net.Mail.MailMessage(); // mail.From = new System.Net.Mail.MailAddress(model.Email); // mail.To.Add("你的收件邮箱"); // mail.Subject = model.Subject; // mail.Body = $"姓名:{model.Name}\n邮箱:{model.Email}\n消息:{model.Message}"; // var smtp = new System.Net.Mail.SmtpClient("你的SMTP服务器地址"); // smtp.Send(mail); TempData["SuccessMsg"] = "消息发送成功!"; return RedirectToAction("Index"); } // 验证失败,返回表单页面并显示错误 return View("Index", model); } } - 创建Index视图(在Views/Contact文件夹下):
@model 你的项目命名空间.Models.ContactModel @if (TempData["SuccessMsg"] != null) { <div class="alert alert-success">@TempData["SuccessMsg"]</div> } @using (Html.BeginForm("Submit", "Contact", FormMethod.Post)) { <div class="form-group"> @Html.LabelFor(m => m.Name) @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" }) </div> <div class="form-group"> @Html.LabelFor(m => m.Email) @Html.TextBoxFor(m => m.Email, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" }) </div> <div class="form-group"> @Html.LabelFor(m => m.Subject) @Html.TextBoxFor(m => m.Subject, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Subject, "", new { @class = "text-danger" }) </div> <div class="form-group"> @Html.LabelFor(m => m.Message) @Html.TextAreaFor(m => m.Message, new { @class = "form-control", rows = 5 }) @Html.ValidationMessageFor(m => m.Message, "", new { @class = "text-danger" }) </div> <button type="submit" class="btn btn-primary">发送消息</button> }
这样整个表单就完全用ASP.NET MVC的技术栈实现了,不需要依赖PHP,部署和维护都更简单。
内容的提问来源于stack exchange,提问作者Rawan
相关产品推荐
相关产品推荐

